我想了半天终于明白为什么代码中 s
的初值为2而且 n
从2计数了,原来是将左边的2分之1乘到右边去了。乘的时候是每一项乘以2,而代码中变成每一个乘数都乘以2了:
所以这个2还得是最后再乘。现在 s
初值为1,n
初值为1后,分母就是分子的2倍加1了:
// 初值n=1
x = x * n / (2 * n + 1)
// 每次n++
最后可能会写出这样的代码:
for (float n = 1; x >= e; n++)
{
x = x * n / (2 * n + 1);
s += x;
}
但是题目中有个小细节,当某一项小于给定精度为止。也就是说某一项小于精度后,这一项不加。上面代码里面最后一次判断了 x>=e
,然后进循环,x
到了下一项,但此时 x
已经小于精度了,但依然还是加了。所以最终的答案还是不对,因此要改变一下代码的结构:
for (float n = 1; x >= e; n++)
{
s += x;
x = x * n / (2 * n + 1);
}
每次判断不小于精度后进入循环,马上就加上去,然后 x
再变换。
这样一来还得改变一下s
和x
的初值,我们可以设 s=0, x=1
,这样第一次循环就是 0+1
,没有问题。
题目要求编写函数实现上面的功能,然后输入输出是放在主函数的。也就是说输入和输出之间夹了个函数调用,大概是这个样子:
float func(float e)
{
float s = 0, x = 1;
...
return 2 * s;
}
int main()
{
float e;
scanf("%f", e);
float pi = func(e);
printf("%f", e);
return 0;
}
你少输入了一个0……
代码的第8行,有两个n++