fightclub 发表于 2022-9-24 11:13:34

使用格雷戈里公式求π的近似值

#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;
}
找不到哪里错误{:5_100:}

柿子饼同学 发表于 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;
}

柿子饼同学 发表于 2022-9-24 12:55:04

你这怎么想的...
最后再乘 4 吧

fightclub 发表于 2022-9-24 13:47:44

柿子饼同学 发表于 2022-9-24 12:55
你这怎么想的...
最后再乘 4 吧

不是也可以每一项都乘以4吗{:9_241:}

fightclub 发表于 2022-9-24 13:53:50

柿子饼同学 发表于 2022-9-24 12:54


这个我懂,但是不知道我的为什么不行。我讲一下我的思路吧:首先先设n的初始值为1,经过1/2n-1就得到了每一项的值,当n为奇数时,pi就要加上那一项的四倍;当n为偶数时,减去那一项的四倍,然后通过n++改变n的值,最后就当那一项小于e时退出循环,然后再判断此时n的奇偶,若为奇数则加,为偶数则减,大概就是这样吧

柿子饼同学 发表于 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;
}

fightclub 发表于 2022-9-24 17:04:18

柿子饼同学 发表于 2022-9-24 14:08
OK 改好了

啊,还有个问题,为什么n加上1之后不会改变k的值啊?怎么不能够传递给上面的式子呢?

柿子饼同学 发表于 2022-9-24 17:21:27

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

它本来就在循环外面 , 你改变了 n , 却没有提到 k , k 当然不会变了
页: [1]
查看完整版本: 使用格雷戈里公式求π的近似值