根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
?2??π??=1+?3??1??+?3×5??2!??+?3×5×7??3!??+?+?3×5×7×?×(2n+1)??n!??+?
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
思路:首先定义一个阈值、单独一项的值,初始化分子分母,定义一个sum值并初始化和最终结果PI。
然后通过循环语句设置循环条件,先讨论第一项,然后讨论其他项。
最后,通过分析分子分母的值来循环计算下一个分子分母的值。得出结果。
#include<stdio.h> int main() { int n=0; double e,f;//e为输入的阈值,f为单独一项的值 double fz=1,fm=1;//初始化分子,分母为1 double sum=0,pi;//sum为各项的和,pi为最终结果 while(scanf("%lf",&e)) { for(f=1;f>=e;n++) { if(n==0)//第一项单独讨论 fz=1; else fz=fz*n;//后一项的分子等于前一项的分子乘上n fm=fm*(2*n+1);//后一项的分母等于前一项的分子乘上(2n+1) f=fz/fm; sum=sum+f; } pi=2*sum; printf("%.6f\n",pi); } return 0; }
上述代码运行时间太长。
#include<stdio.h> int main() { double x; double i = 2, d = 3;//i从第二项开始,d为第二项分母 double temp=1,n = 1, n1 = 2, sum = 1; scanf("%lf", &x); while (temp >= x) { temp = n / d;//每一项的单项 sum += temp; n = n*n1;//分子 n1++; d = d*(2 * i + 1);//分母 i++; } printf("%.6f\n", sum*2); return 0; }