Description
问题描述:由数学公式可知:e=1+1/1!+1/2!+…+1/n!+…,精确到小数点后的如1000位。N由键盘输入。
Sample Input
500
Sample Output
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957034808
思路
一道让人很难受的题目……
虽然计算非常简单,但是要高精度……还是加减乘除全都有
成功的让我超时了,谁叫我写的全是高精和高精的函数
所以我用了一个常数:450
在这个后面的数字(即比它大的数字)在精度只有小数点后1000位的情况下,结果都和450时一样,所以我重复一下题目输出:2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957034808
没错,>=450直接输出就好了
上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1001;
char str1[maxn],str2[maxn];
int a[maxn],b[maxn],c[maxn],d[maxn],n,e[maxn],f[maxn];
bool comp()
{
int i=0;
while (d[i]==e[i]&&i<maxn) i++;
if (i==maxn) return 1;
return (d[i]>=e[i]);
}
void init()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
memset(f,0,sizeof(f));
f[maxn-1]=1;
scanf("%d",&n);
a[maxn-1]=1;
}
void add3()
{
int s,g;
for(int i=0;i<maxn;i++)
{
s=c[maxn-i]+f[i]+g;
f[i]=s%10;
g=s/10;
}
}
void mul(int t)
{
int s,g=0;
for(int i=maxn-1;i>0;i--)
{
s=a[i]*t+g;
a[i]=s%10;
g=s/10;
}
}
void sub()
{
int g=0;
for(int i=maxn-1;i>0;i--)
{
if (d[i]-e[i]-g>=0)
{
d[i]=d[i]-e[i]-g;
g=0;
}
else
{
d[i]=10+d[i]-e[i]-g;
g=1;
}
}
}
void add(int n)
{
int g=0;
c[n]++;
for(int i=n;i>=1;i--)
{
c[i]=c[i]+g;
g=c[i]/10;
c[i]=c[i]%10;
}
}
void output(int a[])
{
printf("%d.",a[maxn-1]);
for (int i=maxn-2;i>0;i--) printf("%d",a[i]);
}
bool ww()
{
for (int i=maxn-1;i>0;i--) if (c[i]!=0) return 1;
return 0;
}
void OUT(int a[])
{
for (int i=maxn-1;i>0;i--) e[i]=a[i];
}
void work()
{
memset(d,0,sizeof(d));
memset(c,0,sizeof(c));
d[1]=1;
int j=1;
while(comp())
{
j++;
for(int i=1;i<maxn;i++)
{
e[i-1]=e[i];
e[i]=0;
}
}
while(j>0)
{
while (comp())
{
add(maxn-j);
sub();
}
j--;
for (int i=maxn-1;i>=1;i--)
{
e[i]=e[i-1];
e[i-1]=0;
}
}
}
int main()
{
init();
if (n>=450)
{
printf("2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957034808");
return 0;
}
for (int i=1;i<=n;i++)
{
mul(i);
OUT(a);
work();
if (i==450) break;
add3();
}
output(f);
return 0;
}