7-15 计算圆周率
根据下面的关系式,求圆周率的值,直到最后一项的值小于给定阈值
输入格式
输入在一行中给出小于1的阈值。
输出格式
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例
0.01
输出样例
3.132157
分析与答案
看到阶乘应该都能回忆起来6-10 阶乘计算升级版里提到过的阶乘导致数据溢出的陷阱,在那道题中我采用了相对复杂一点的利用数组来模拟乘法计算的操作。在这道题中,考虑到阈值大概率不会给到非常小的数字,我们可以先不用这么复杂的操作,而是用一个double
类型变量来储存
下面的程序将计算数列项for
循环求和计算,当数列项小于给出的精度accu
时退出,最后输出时记得要乘2并保留指定小数位数。
#include <stdio.h>
double child_cal(int i);
int main(){
double accu;
scanf("%lf",&accu);
double pi_half = 0, pi_child = 1;
for(int i = 1; pi_child >= accu;i++) {
pi_half += pi_child;
pi_child = child_cal(i);
}
printf("%.6lf", 2*(pi_half+pi_child));
return 0;
}
double child_cal(int i){
int j;
double up = 1,down = 1;
for (j = 1;j <= i;j++){
up *= j;
down *= 2*j+1;
}
return up / down;
}