冽栀 2021-12-04 12:48 采纳率: 80%
浏览 41
已结题

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

img

img

  • 写回答

3条回答 默认 最新

  • 亡心灵 2021-12-04 13:29
    关注

    第一个问题

    我想了半天终于明白为什么代码中 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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月12日
  • 已采纳回答 12月10日
  • 创建了问题 12月4日

悬赏问题

  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离
  • ¥30 线性代数的问题,我真的忘了线代的知识了
  • ¥15 有谁能够把华为matebook e 高通骁龙850刷成安卓系统,或者安装安卓系统
  • ¥188 需要修改一个工具,懂得汇编的人来。
  • ¥15 livecharts wpf piechart 属性
  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题