根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
2π=1+31+3×52!+3×5×73!+⋯+3×5×7×⋯×(2n+1)n!+⋯
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
结尾无空行
输出样例:
3.132157
结尾无空行
下面这个代码只能部分通过:
#include<stdio.h>
int Fact(int n)
{
int sum=1;
if(n==1||n==0)
return sum;
else
{
while(n>=2)
{
sum*=n;
n--;
}
return sum;
}
}
int f(int n)
{
int i = 1;
int sum = 1;
for (i = 1; i <= n; i += 2)
{
sum *= i;
}
return sum;
}
int main()
{
double x;
scanf("%lf", &x);
int fenmu = 1;
int fenzi = 1;
double tem = 1.0 * fenzi / fenmu;
double sum = 0.0;
int i = 0, j = 1;
while(1)
{
if (tem < x)
{
break;
}
else
{
fenzi = Fact(i);
i++;
fenmu = f(j);
j += 2;
tem = 1.0 * fenzi / fenmu;
sum += tem;
}
}
printf("%.6lf\n", 2*sum);
return 0;
}
但是只能部分通过:
看来这道题不准单独求阶乘。
通过通项公式我们直到,每一项都是在前一项乘以 i /(2*i+1),根据这个,写出正确代码如下:
#include <stdio.h>
int main()
{
double x;
scanf("%lf", &x);
double tem = 1.0;
double sum = 0.0;
int i = 1;
while (1)
{
if (tem < x)
{
break;
}
else
{
sum += tem;
tem = tem * i / (2.0 * i + 1);
i++;
}
}
sum += tem;
printf("%.6lf\n", 2 * sum);
return 0;
}
测试结果: