C++高精度计算e,可以算无数位,且不四舍五入,比计算器好用的多

说明
自然对数的底数e是一个著名的无理数,其近似值为2.718281828…2.718281828…有计算e的公式如下:
e=\sum_{n=0}^{\infty}\frac{1}{n!}
e=
n=0


n!
1

其中n!表示n的阶乘,即n!=1\times 2 \times 3 \times …\times nn!=1×2×3×…×n。
请计算e后n(n \le 10000)n(n≤10000)位。

输入格式
只有一行:n

输出格式
若干行。
第一行:2.
第二行开始:e的小数部分。10个数一个空格,50个数一次回车。

样例
输入数据 1
100
输出数据 1
2.
7182818284 5904523536 0287471352 6624977572 4709369995
9574966967 6277240766 3035354759 4571382178 5251664274

#include
using namespace std;
const int mn=10010;
int a[mn],s[mn];
int p,i,n,x,r;
void pp()
{
	cout<<s[0]<<'.'<<endl;
	for (p=1; p<=n; p++)
		{
			cout<<s[p];
			if (p%10==0)  cout<<' ';
			if (p%50==0)  cout<<endl;
		}
}
bool isend()
{
	int p=0;
	while (a[p]==0) p++;//  找到了a数组中第一个不是0的数位
	return p>n+10;   // 保留n位 但是算到n+10位 保险
}
int main()
{  cin>>n;
	for (p=1; p<=n+10; p++) a[p]=s[p]=0;
	s[0]=a[0]=1;
	for (i=1; !isend(); i++)
		{
			///x=x/i;
			r=0;
			for (p=0; p<=n+10; p++)
				{
					x=10*r+a[p];
					a[p]=x/i;
					r=x%i;
				}
			///s=s+x
			for (p=0; p<=n+10; p++) s[p]+=a[p];
			///进位三连
			for (p=n+10; p>0; p--)
				{
					x=s[p];
					s[p]=x%10;
					s[p-1]+=x/10;//往左进位
				}
		}
	pp();
	return 0;
}

你可能感兴趣的:(C++,奇闻,牛逼程序,c++,算法,开发语言,青少年编程,学习)