根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
2π=1+31+3×52!+3×5×73!+⋯+3×5×7×⋯×(2n+1)n!+⋯
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
#include<stdio.h>
double factorial(int a);
double products(int b);
int main()
{
double m; // 多项式中每一项的值
int n;
double sum;
double s;
double PI;
double a,b;
scanf("%lf",&s); // 阀值
sum = 1.0;
m = 1.0; // 先将m设为1
n = 1;
while( m > s) // 当m小于阀值时跳出循环
{
a = factorial(n); // 分子
b = products(n); // 分母
m = a/b; // 求每一项的值
sum = sum + m;
n++;
}
PI = 2.0*(sum);
printf("%lf",PI);
return 0;
}
double factorial(int a) // factorial函数计算每一项的分母,即阶乘
{
int i;
double producta;
producta = 1;
for( i=1; i<=a; i++)
{
producta = producta*i;
}
return (producta);
}
double products(int b) // products函数计算每一项的分母
{
int i;
double productb;
productb = 1;
i=3;
while( i<= (2*b+1) )
{
productb = productb*i;
i=i+2;
}
return (productb);
}
计算阶乘时,必须设为long long类型,后面还需要转换为double类型。转换时就会出问题,因为当数值超大时,double是无法全部转换long long的,它会转换为负数。所以你既不能是普通整型,又不能用double转换大数值,所以最初时就要用double类型计算。