C++编程 下列级数计算e的近似值,是e有小数点后1000位有效数字。 这道题的思路和原理是,每个步骤的意思

#include<iostream>usingnamespacestd;intmain(){intN=1000;inta[1000];//定义一个数组ints=1;for... #include<iostream>
using namespace std;

int main()
{ int N=1000;
int a[1000]; //定义一个数组
int s=1;
for(int n=N;n>=1;n--)
{ int r=s%n;
s=s/n+1;
for(int i=0;i<N;i++)
{ r=r*10+a[i];
a[i]=r/n;
r%=n;
}
for(i=N-1;i>0;i--)
{a[i-1]+=a[i]/10;
a[i]%=10;
}
s+=a[0]/10;
a[0]%=10;}
cout<<s<<".";
for(int i=0;i<N;i++)
{cout<<a[i];}
cout<<endl;
return 0;
}
展开
 我来答
二十一弦2
2014-07-21 · TA获得超过4796个赞
知道小有建树答主
回答量:518
采纳率:0%
帮助的人:524万
展开全部

源代码排版下:

#include<iostream>
using namespace std;

int main() {
int N = 3;
int a[ 1000 ] = { 0 };     //定义一个数组
int s = 1;
for ( int n = N; n >= 1; n-- )
{
int r = s%n;
s = s / n + 1;
int i = 0;
for ( ; i<N; i++ )
{
r = r * 10 + a[ i ];
a[ i ] = r / n;
r %= n;
}
for ( i = N - 1; i>0; i-- )
{
a[ i - 1 ] += a[ i ] / 10;
a[ i ] %= 10;
}
s += a[ 0 ] / 10;
a[ 0 ] %= 10;
}
cout << s << ".";
for ( int i = 0; i < N; i++ )
{
cout << a[ i ];
}
cout << endl;
system( "pause" );
return 0;
}


     这个算法是用来计算自然对数e的近似值,结果存在一个内存数组里。数学思想是基于欧拉1748年把牛顿的二项式定理改进的一个公式(3)

    这个公式使得欧拉把e精确到23位小数点。受欧拉公式的启发,衍生出来很多变种。其中的一个变种是

    本算法就是对(4)公式的翻译。第一个外循环是累乘计算(4)式的每一个括号项。当k足够大的时候,式子的...≈0,所以可以初始化为s=1.第一个内循环是计算(1+r)/k,把每一位小数存入相应的数组位置里。由于每一次内循环都会往各个小数位上加上一定的商,所以会超过10,于是要把他放到前一位里面,这便是第二位做的事情。

    我想对着公式看代码便容易很多,也就没必要我写出每一步代码具体的意思了。

    还有很多计算e的高效算法,请参见参考资料。

    参考资料:

  1. http://numbers.computation.free.fr/Constants/E/e.html#eSeries

  2. http://numbers.computation.free.fr/Constants/TinyPrograms/tinycodes.html#tth_sEc2

  3. http://stackoverflow.com/questions/3028282/an-efficient-way-to-compute-mathematical-constant-e

  4. http://codereview.stackexchange.com/questions/33015/why-is-my-c-program-for-calculating-eulers-constant-of-poor-quality/33019#33019

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式