[7-15 计算圆周率 (15分)]

[7-15 计算圆周率 (15分)]

(https://pintia.cn/problem-sets/14/problems/795)
题目要求
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
在这里插入图片描述
输入格式:
输入在一行中给出小于1的阈值。

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

输入样例:
0.01
输出样例:
3.132157

思路:
开始时想将每个分式分开考虑,因此建立了两个函数来分别计算分子的阶乘与分母的连乘;
但提交时,在“直接计算n!会超长整型”的要求下会出错;

#include <stdio.h>
int jiecheng(int x){//求阶乘
    int he=1;
    for(;x>=1;x--){
        he*=x;
    }
    return he;
}
int fenmu(int y){   //求分母
    int he=1;
    for(;y>=1;y--){
        he*=(2*y+1);
    }
    return he;
}

int main(){
    double m,a,b;
    double sum=1,last=1;
    scanf("%lf",&m);
    for(int i=1;last>=m;i++){//分别计算每一个分式,并相加
        a=jiecheng(i);
        b=fenmu(i);
        last=a/b;
        sum+=last;
    }
    printf("%f",2*sum);
    return 0;
}

之后我发现了每个分式之间的关联,
每个分式的分子与分母之间是递进关系
于是便有了最后的答案:

#include <stdio.h>
int main(){
    double m;
    double last=10;
    double sum=1;
    double a=1,b=1;
    int i=1,j=1;    
    scanf("%lf",&m);
    while(last>=m){//last为分式,a为分子,b为分母
        b=b*(2*j+1);
        last=a/b;
        sum+=last;
        a=a*(i+1);
        i++;
        j++;
    }
    printf("%f\n",2*sum);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值