[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;
}