天天看點

解不等式之平方根不等式

對指定的正數n,試求滿足以下平方根不等式的正整數;

√m+√(m+1)+√(m+2)+···+√(2*m)>=n

1.說明:

顯然不等式左邊是m的增函數,因而對于指定的正數n設定m循環,m從1開始遞增1取值,對每一個m求和:

s(m)=√m+√(m+1)+√(m+3)+···√(2*m)

如果s(m) < n;

m增1後繼續按上式求和判别,直至s>=n時輸出不等式的解。

2.程式設計:

(1).應用循環設計求解;

#include<stdio.h>
#include<math.h>
void main()
{
  long i,m;
  double n,s,s1;
  printf("請輸入正數n(n>3):");
    scanf("%lf",&n);    /*輸入任意正數*/
  m=0;
  while(1)
  {
    m++;
    s=0;
    for(i=m;i<=2*m;i++)
      s+=sqrt(i);    /*對每一個m計算和s*/
    if(s>=n)
      break;
    else 
      s1=s;     /*為以下注明提供依據*/
  }
  printf("不等式的解為:m>=%ld\n",m);
  printf("注:當m=%ld時,s=%.2f;當m=%ld時,s=%.2f\n",m-1,s1,m,s);
  getch();
}
           

(2).應用遞推設計求解;

事實上,可以建立s(m)與s(m-1)之間的遞推關系,應用遞推簡化求解平方根不等式。

對于m-1與m,累加和s(m)與s(m-1)顯然滿足以下遞推關系:

s(m)=s(m-1)-√(m-1)+√(2* m-1)+√(2* m)

初始條件:s(1)=1+√2

是以,前面程式設計中的雙循環可簡化為單循環,程式效率得以大大提高。

#include<stdio.h>
#include<math.h>
void main()
{
  long m;
  double n,s,s1;
  printf("請輸入正數n(n>3):");
    scanf("%lf",&n);
  m=1;
  s=1.0+sqrt(2);
  do
  {
    m++;
    s1=s;
    s=s-sqrt(m-1)+sqrt(2*m-1)+sqrt(2*m);
  }while(s<n);
  printf("不等式的解為:m>=%ld\n",m);
  printf("注:當m=%ld時,s=%.2f;當m=%ld時,s=%.2f\n",m-1,s1,m,s);
  getch();
}
           

3.程式運作示例及其注意事項:

請輸入正數n(n>3):2017

不等式的解為:m>=140

注:當m=139時,s=2011.83;當m=140時,s=2033.48

注意:以上程式中的“注”對解不等式并不是必要的,隻是為了說明不等式解。同時,輸入的數不限定為整數,可為任意正數(約定n>3)。