浙大PTA<基础编程题目集>:7-15 计算圆周率
题目内容
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
π 2 = 1 + 1 3 + 2 ! 3 × 5 + 3 ! 3 × 5 × 7 + ⋯ + n ! 3 × 5 × 7 × ⋯ × ( 2 n + 1 ) + … \frac{\pi}{2}=1+\frac13+\frac{2!}{3\times 5}+\frac{3!}{3\times 5\times7}+\dots+\frac{n!}{3\times 5\times7\times \dots\times(2n+1)}+\dots 2π=1+31+3×52!+3×5×73!+⋯+3×5×7×⋯×(2n+1)n!+…
输入格式
输入在一行中给出小于1的阈值。
输出格式
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例
0.01
输出样例
3.132157
代码一:C语言
一开始,我是用了两个函数(如下),分子一个,分母一个,然后两个函数相除求解。但是,直接计算n!会超长整型,不可取。
#include "stdio.h"
int f1(int n)
{
int num = 1;
int i;
for (i=1; i<=n; i++){
num *= i;
}
return num;
}
int f2(int n)
{
int num = 1;
int i;
for (i=1; i <= 2*n+1; i++){
if (i%2 == 1) num *= i;
}
return num;
}
int main(){
float sum=1.00;
//scanf("%f",&x);
float x = 0.01;
int i;
for(i=1; ; i++){
float a = f1(i), b = f2(i);
double c;
c = a/b;
if(c >= x) sum += c;
else break;
}
printf("%f",sum*2);
return 0;
}
结果是:
3.121501
所以,应该将整个分式看为一个整体,代码如下
#include "stdio.h"
int main(){
int n=1;//第n项
float x, num, sum=1;//x是阈值,num是每一个单项
scanf("%f",&x);
for(num=1; num>=x; n++){
num = num*n/(2*n+1);//每一项都是前一项*n/(2n+1)
sum+=num;
}
printf("%f",sum*2);
return 0;
}
直接看作整体的写法很简洁,并且正确。
代码二:Python
同样的思路,用python也很快捷
# -*- coding: utf-8 -*-
x = eval(input())
n = 1
sum0 = 1
num = 1
while num >= x:
num = num*n/(2*n+1)
sum0 = sum0+num
n = n+1
print("{:.6f}".format(sum0*2))