根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
pi/2=1+1/3+2!/3*5+...+n!/(3*5*7*...(2*n+1))
输入格式:
输入在一行中给出小于1的阈值。
输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
这道题看似简单,实则有大坑,首先你不能是计算好整型再转换,这里又有个坑,如果你要写整型,
那么必须是long long,否则过不了几个测试点,其次如果你是long long类型,那么转换成double,就会出问题,
因为当数值超大时,double是无法全部转换long long的,它会转换为负数。。所以你既不能是普通整型,又不能
用double转换大数值,那么你只有一开始计算的时候都是用double来计算。
那么出于效率和简化的目的,此题可以用动态规划的策略,自底向上一步步迭代上去。代码如下:
#include<iostream> #include<iomanip> using namespace std; int main() { double item=1,thrv,sum=1; double memb=1,deno=1; int i=1,j=3; cin>>thrv; while(item>=thrv) { memb*=i; deno*=j; item=memb/deno; sum+=item; i++; j+=2; } cout<<setiosflags(ios::fixed)<<setprecision(6)<<2*sum; }