鱼C论坛

 找回密码
 立即注册
查看: 1996|回复: 2

[已解决]课后作业拾遗,根据以下已知公式求Pi的近似值,要求正确计算出小数点后前七位

[复制链接]
发表于 2019-5-29 16:30:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看了答案也不是很明白。
#include <stdio.h>
#include <math.h>

int main()
{
        int sign = 1; // 表示符号
        double pi = 0.0, n = 1, term = 1.0; // n表示分母,term表示当前项的值

        while (fabs(term) >= 1e-8) // 1e-8表示10^(-8)
        {
                pi = pi + term;
                n = n + 2;
                sign = -sign;
                term = sign / n;
        }

        pi = pi * 4;
        printf("pi = %10.7f\n", pi);

        return 0;
}
希望能解读下这段代码的意思
最佳答案
2019-5-29 17:33:56
首先,公式给你了,
提示1,分子永远都是1,包括第一个,1=1/1,那么我们可以设一个常数1,来表示分子,也就是代码中的sign=1
提示2,分母的规律就是从1开始,后面每一项都加2,那么,我们可以设分母一开始为1,每循环一次,加2,也就是代码中的n=1
提示3,每次前一个数和后一个数的符号都相反,所以,在循环的时候要变号,也就是sign=-sign
提示4,因为我们是把每一项的值加起来,而每一项会越来越小,因为分母越来越大,题目要我们求小数点后七位,所以到最后一项为八位的时候,就可以停下来了

好,开始看代码,首先我们要明白,这题是要用循环,把每一项加起来求和。
1.double pi = 0.0, n = 1, term = 1.0;    pi就是我们要求的总和,一开始是0,n就是分母,term是我们要求的每一项的值,一开始是1,从1加起的
2.然后 while (fabs(term) >= 1e-8),循环,到小数点第8位的时候停下来(代码第9位才停下来的原因可能是取第8位,保持精准度),注意,要取绝对值,因为循环中term的值会变成负数
3.            pi = pi + term;                  一开始总和pi和第一项相加,得到前一项的总和
                n = n + 2;                       然后分母加2
                sign = -sign;                     下一项是负数,所以,把sign变为负数
                term = sign / n;                然后得出下一项的值
                                                      然后循环
4.这样,得出pi是所有项的总和,然后乘4,得出真正的pi,一共循环到小数点的后八位,保持前七位的精度
5.输出结果,10.7f表示输出10位位宽输出,其中小数占7位,不足的右边补空格。
68a511d774bbe80fe7fe5a99d47ae70.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-29 17:33:56 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

首先,公式给你了,
提示1,分子永远都是1,包括第一个,1=1/1,那么我们可以设一个常数1,来表示分子,也就是代码中的sign=1
提示2,分母的规律就是从1开始,后面每一项都加2,那么,我们可以设分母一开始为1,每循环一次,加2,也就是代码中的n=1
提示3,每次前一个数和后一个数的符号都相反,所以,在循环的时候要变号,也就是sign=-sign
提示4,因为我们是把每一项的值加起来,而每一项会越来越小,因为分母越来越大,题目要我们求小数点后七位,所以到最后一项为八位的时候,就可以停下来了

好,开始看代码,首先我们要明白,这题是要用循环,把每一项加起来求和。
1.double pi = 0.0, n = 1, term = 1.0;    pi就是我们要求的总和,一开始是0,n就是分母,term是我们要求的每一项的值,一开始是1,从1加起的
2.然后 while (fabs(term) >= 1e-8),循环,到小数点第8位的时候停下来(代码第9位才停下来的原因可能是取第8位,保持精准度),注意,要取绝对值,因为循环中term的值会变成负数
3.            pi = pi + term;                  一开始总和pi和第一项相加,得到前一项的总和
                n = n + 2;                       然后分母加2
                sign = -sign;                     下一项是负数,所以,把sign变为负数
                term = sign / n;                然后得出下一项的值
                                                      然后循环
4.这样,得出pi是所有项的总和,然后乘4,得出真正的pi,一共循环到小数点的后八位,保持前七位的精度
5.输出结果,10.7f表示输出10位位宽输出,其中小数占7位,不足的右边补空格。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-29 19:07:17 | 显示全部楼层
#include <stdio.h>

void main()
{
    double pi = 0,num;
    int i = 1;

    do
    {
        num =(double)1/(i*2-1);
        if(num < 1e-8)
        {
            break;
        }
        else
        {
            if(i % 2 == 1)
            {
                pi += num;
            }
            else
            {
                pi -= num;
            }
        }
        i++;
    }
    while(1);

    pi *= 4;

    printf("pi = %.7lf\n",pi);

可以不用fabs函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表