7-15 计算圆周率

根据下面的关系式,求圆周率的值,直到最后一项的值小于给定阈值

π2=1+13+2!3×5+3!3×5×7++n!3×5×7××(2n+1)+

输入格式

输入在一行中给出小于1的阈值。

输出格式

在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

输入样例

0.01

输出样例

3.132157

分析与答案

看到阶乘应该都能回忆起来6-10 阶乘计算升级版里提到过的阶乘导致数据溢出的陷阱,在那道题中我采用了相对复杂一点的利用数组来模拟乘法计算的操作。在这道题中,考虑到阈值大概率不会给到非常小的数字,我们可以先不用这么复杂的操作,而是用一个double类型变量来储存n!的值(溢出了再说吧,实际上测试点也只是测试了长整型溢出的情况)。

下面的程序将计算数列项n!3×5×7××(2n+1)​的过程单独做成了一个函数,使主函数相对简洁一些。主程序的核心是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;
}

7-15 测试点