根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
(frac{pi}{2} = 1+frac{1}{3} + frac{2!}{3 imes 5}+ frac{3!}{3 imes 5 imes 7}+cdots + frac{n!}{3 imes 5 imes 7 imes cdots imes (2n+1)}+cdots)
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
解题思路:
- 程序的实现不难,分子,分母,累加和分开设置即可。
- 主要卡在数据点上。如果对数据的精度要求较高,计算结果的式子应该全为 double 型,即使有些变量(说的是参与除了加减之外的情况)只需要 int 型,也需要定义成 double 型。
解题代码:
#include<stdio.h>
int main ()
{
double threshold;
scanf("%lf", &threshold);
double fact = 1; // fact 要定义为 double,不然会导致精度降低
int i = 1;
double de = 1.0;
double threshold_calc;
double pi_half = 1.0;
do {
fact = fact * i;
de = de * (2 * i + 1);
i++;
pi_half = pi_half + fact / de;
threshold_calc = fact / de;
} while (threshold_calc >= threshold);
printf("%f
", pi_half * 2.0);
return 0;
}