鱼C论坛

 找回密码
 立即注册
查看: 3680|回复: 7

[已解决]使用格雷戈里公式求π的近似值

[复制链接]
发表于 2022-9-24 11:13:34 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
int main()
{
    int n=1;
    float e,pai=0;
    scanf("%f",&e);
    float k;
    k=1/(2*n-1);
    while(k>=e){
        if(n%2==1){
            pai+=4*k;
        }
        if(n%2==0){
            pai-=4*k;
        }
        n++;
    }
    printf("%.6f",pai);
    return 0;
}
找不到哪里错误
最佳答案
2022-9-24 14:08:00
fightclub 发表于 2022-9-24 13:53
这个我懂,但是不知道我的为什么不行。我讲一下我的思路吧:首先先设n的初始值为1,经过1/2n-1就得到了每 ...

OK 改好了
#include <stdio.h>

int main(){
    int n = 1;
    double e, pi = 0, k; // 建议 double , 精度更高

    scanf("%lf", &e); // double 的格式是 %lf
    k = 1.0 / (2*n - 1); // 这里要写 1.0 , 不然它会变成整数

    while(k >= e){
        if(n % 2) pi += 4*k;
        else pi -= 4*k;
        n++;
        k = 1.0 / (2*n - 1); // 这里要更新 k 的值, 不然一直是一样的
    }

    printf("%.6lf", pi);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-24 12:54:27 | 显示全部楼层
// PI/4 = 1 - 1/3 + 1/5 - 1/7 + ...
#include <stdio.h>

int precision;      // 精度, 越大越精确
int signal = 1;     // 符号, 有 -1 和 1 两种
double pi = 0;      // 就是 pi
double item = 1;    // 每次加的值
int deno = 1;       // 每次给 item 除的值

int main(){

    scanf("%d", &precision);

    while(precision > 0){ // 算这么多次
        item = signal * 1.0 / deno; // 1, 1/3 ...
        pi += item;
        signal = -signal;
        deno += 2;
        precision--;
    }

    pi *= 4;

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

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 12:55:04 | 显示全部楼层
你这怎么想的...
最后再乘 4 吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 13:47:44 | 显示全部楼层
柿子饼同学 发表于 2022-9-24 12:55
你这怎么想的...
最后再乘 4 吧

不是也可以每一项都乘以4吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 13:53:50 | 显示全部楼层

这个我懂,但是不知道我的为什么不行。我讲一下我的思路吧:首先先设n的初始值为1,经过1/2n-1就得到了每一项的值,当n为奇数时,pi就要加上那一项的四倍;当n为偶数时,减去那一项的四倍,然后通过n++改变n的值,最后就当那一项小于e时退出循环,然后再判断此时n的奇偶,若为奇数则加,为偶数则减,大概就是这样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 14:08:00 | 显示全部楼层    本楼为最佳答案   
fightclub 发表于 2022-9-24 13:53
这个我懂,但是不知道我的为什么不行。我讲一下我的思路吧:首先先设n的初始值为1,经过1/2n-1就得到了每 ...

OK 改好了
#include <stdio.h>

int main(){
    int n = 1;
    double e, pi = 0, k; // 建议 double , 精度更高

    scanf("%lf", &e); // double 的格式是 %lf
    k = 1.0 / (2*n - 1); // 这里要写 1.0 , 不然它会变成整数

    while(k >= e){
        if(n % 2) pi += 4*k;
        else pi -= 4*k;
        n++;
        k = 1.0 / (2*n - 1); // 这里要更新 k 的值, 不然一直是一样的
    }

    printf("%.6lf", pi);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 17:04:18 | 显示全部楼层

啊,还有个问题,为什么n加上1之后不会改变k的值啊?怎么不能够传递给上面的式子呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 17:21:27 | 显示全部楼层
fightclub 发表于 2022-9-24 17:04
啊,还有个问题,为什么n加上1之后不会改变k的值啊?怎么不能够传递给上面的式子呢?

它本来就在循环外面 , 你改变了 n , 却没有提到 k , k 当然不会变了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 22:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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