根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
π/2 = 1 + 1/3 + 2!/3*5 + 3!/3*5*7 + ... + n!/3*5*7*...*(2n+1)+....
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
正确的代码样例:
#include<stdio.h>
int main()
{
double threshold;//阈值
scanf("%lf",&threshold);
double sum=1,sum1=1,sum2=1;
int i=1,j=1;
while(sum1/sum2>=threshold)
{
if(sum2==1) sum1=1;//第一项为1,跳过分子增加的过程;
else
{
sum1=sum1*(i+1);
i++;
}
sum2=sum2*(j+2);
j+=2;
sum+=sum1/sum2;
}
printf("%.6lf",sum*2);
return 0;
}
刚开始做的时候一直错,检查了好几遍算法,就是跟结果差一点,后来发现是得到最终值的方法有问题,测试点也提示:“直接计算n!会超长整型”。
错误的代码样例:
#include<stdio.h>
int main(){
float min;
double num=1,sum=1;
int i;
scanf("%f",&min);
if(min>=1)
{
printf("2.000000");
}
else
{
for(i=1;;i++)
{
num*=(1.0*i)/(2*i+1);
if(num<min)
{
break;
}
sum+=num;
}
printf("%.6f",sum*2);
}
return 0;
}