思考:为什么循环体外给m,s赋值为m=i-1; s=s-i*i*i?直接给出i与s行吗?
-------------------------------------------------------------------
1.6.2 调和级数不等式 12<1+1/2+1/3+...+1/m<13
试求满足上述不等式的整数m。
本题算法如下:
为一般设计,设和s的整数部分为n,设置i循环,可预置1000000次。求和s=s+1/i过程中若出现s>n,此时c=i为区间的下限。若出现s>n+1,此时d=i-1为所求区间的上限,然后退出循环。
设计时务必注重,出现s>n且赋值c=i之后的继续求和过程中,条件s>n始终成立,于是由初值c=i确定的下限c也随之改变。为防止确定了下限c后再发生改变,引入中间变量s0,s0赋初值n+1,把判别条件改为(s>n and s<s0)。出现s>n(自然会有s<s0)时,作赋值c=i的同时通过s0=s改变了s0,随后继续求和,s增加时,致使条件(s>n and s<s0)不再成立,确保已定下限c不再改变。
程序代码如下:
#include<stdio.h>
void main()
{
float s,s0,c=0,d=0,i;
int n;
printf("求n<1+1/2+1/3+...+1/m<n+1的整数m\n请输入n:");
scanf("%ld",&n);
s=0;
s0=(float)n+1;
for(i=1;i<=1000000;i=i+1)
{
s=s+(float)1/i;
if(s>n&&s<s0){c=i; s0=s;}
if(s>n+1){ d=i-1;break;}
}
printf("满足不等式的m为: %.f < m < %.f\n",c,d);
}
程序运行结果如下:
------------------------------------------------------------------
1.6.3 平方根不等式
对指定正整数n,试求满足上述平方根不等式的最小整数m。
本题算法如下:
显然,不等式左边是m的增函数,因而,对于指定的n,设置m循环m从1开始递增1取值。对每一个m求和:
若s<n,m增1后继续按上式求和判别,直至上述s>n时,输出不等式的解。
程序代码如下:
#include<stdio.h>
#include<math.h>
void main()
{
int i,n,m;
double s;
printf("求满足sqrt(m)+sqrt(m+1)+...+sqrt(2m)>n 的整数m\n请输入n:");
scanf("%d",&n);
for(m=1;m<=10000;m++)
{
s=0;
for(i=m;i<=2*m;i++)
s=s+sqrt(i);
if(s>n) break;
}
printf("不等式的解为:m > %d\n",m);
printf("此时 s = %.2f\n",s);
}
程序运行结果如下: