我这感觉算式没问题,但是结果异常离谱

img

img

第一个问题

我想了半天终于明白为什么代码中 s 的初值为2而且 n 从2计数了,原来是将左边的2分之1乘到右边去了。乘的时候是每一项乘以2,而代码中变成每一个乘数都乘以2了:

img

所以这个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 再变换。

这样一来还得改变一下sx的初值,我们可以设 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++