浙大PTA基础编程题目集:7-15 计算圆周率

浙大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))

你可能感兴趣的:(浙大PTA基础编程题目集)