使用格雷戈里公式求π的近似值
#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:} // 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;
} 你这怎么想的...
最后再乘 4 吧 柿子饼同学 发表于 2022-9-24 12:55
你这怎么想的...
最后再乘 4 吧
不是也可以每一项都乘以4吗{:9_241:} 柿子饼同学 发表于 2022-9-24 12:54
这个我懂,但是不知道我的为什么不行。我讲一下我的思路吧:首先先设n的初始值为1,经过1/2n-1就得到了每一项的值,当n为奇数时,pi就要加上那一项的四倍;当n为偶数时,减去那一项的四倍,然后通过n++改变n的值,最后就当那一项小于e时退出循环,然后再判断此时n的奇偶,若为奇数则加,为偶数则减,大概就是这样吧 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;
} 柿子饼同学 发表于 2022-9-24 14:08
OK 改好了
啊,还有个问题,为什么n加上1之后不会改变k的值啊?怎么不能够传递给上面的式子呢? fightclub 发表于 2022-9-24 17:04
啊,还有个问题,为什么n加上1之后不会改变k的值啊?怎么不能够传递给上面的式子呢?
它本来就在循环外面 , 你改变了 n , 却没有提到 k , k 当然不会变了
页:
[1]