这是一个数学问题,首先你要先想好如何求得问题的解,也就是所谓的“算法”
按照你的思路,
首先利用数学知识可以知道s是关于n的单调递增函数,所以s与8最接近的值一定是
s(k)<8在程序中先初始化 int n = 1; //很重要,如果为0的话是不能做除数的
然后累加 s+= 1.0/n ;
当s第一次大于8时,while循环退出;
当循环退出以后,要注意此时s已经大于8了,所以此时的s 就是上面所说的s(k+1),
此时的n 就是上面所说的k+1
因为s(k+1) = 1+1/2 + 1/3 + ... + 1/k + 1/(k+1)
现在要求出 s(k),很显然,这个值只需要 s(k+1) - 1/(k+1) 就得到了,不必再写个循环计算
不妨再写一个变量 double s1 = s - 1.0/n 就是 恰好比8小的数列和值。
接下来比较一下 8-s1 和 s - 8 两个的大小
if ((8-s1) <= (s-8))
{
//表示离8最近的s是比8小的那个
s = s1; //把s1赋值给s
n = n-1;
}
else
{
//表示离8最近的s是比8大的那个,那就不用做什么赋值
}
最后输出结果即可。要注意s是浮点数,所以格式化输出不能用%d,应该用%f
我调试运行的结果为
s=7.999889, n=1674
附:完整的程序
#include
void main()
{
int n = 1;
double s=0, s1=0;
while(s<=8)
{
s+=(1.0/n);
n++;
}
s1 = s - 1.0/n;
if((8-s1) < (s-8))
{
s=s1;
n=n-1;
}
printf("s=%f,n=%d",s,n);
}
int n=1;//这里n应该赋初值1,否则下面的while实际上会成为死循环
double s=0,m=0;
while(s<=8)
{
s+=(1.0/n);
n++;
}
for(n=1;n<=n+1;n++)//这里是死循环