阶乘的累加和
Time Limit:1000MS Memory Limit:65536K
Description
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入正整数N,输出计算结果S。
Input
一个正整数N (1 ≤ n ≤ 50)
Output
一行,结果
Sample Input
2
Sample Output
3
Source
NOIP1998年第四届全国青少年信息学奥林匹克分区联赛复赛普及组第二题
1 //水题…… 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int a[100000],n,i,y,xy[100000],s[100000]; 6 7 void add() 8 { 9 int i; 10 memset(xy,0,sizeof(xy)); 11 xy[0]=max(s[0],a[0]); 12 for (i=1;i<=xy[0];i++) 13 { 14 xy[i]+=s[i]+a[i]; 15 xy[i+1]=xy[i]/10; 16 xy[i]%=10; 17 } 18 while (xy[xy[0]+1]>0) 19 { 20 xy[xy[0]+2]=xy[xy[0]+1]/10; 21 xy[xy[0]+1]%=10; 22 xy[0]++; 23 } 24 s[0]=xy[0]; 25 for (i=1;i<=xy[0];i++) s[i]=xy[i]; 26 } 27 int main() 28 { 29 cin>>n; 30 a[0]=1; 31 a[1]=1; 32 s[0]=1; 33 s[1]=0; 34 for (y=1;y<=n;y++) 35 { 36 memset(xy,0,sizeof(xy)); 37 xy[0]=a[0]; 38 for (i=1;i<=a[0];i++) 39 { 40 xy[i]+=a[i]*y; 41 xy[i+1]=xy[i]/10; 42 xy[i]%=10; 43 } 44 while (xy[xy[0]+1]>0) 45 { 46 xy[xy[0]+2]=xy[xy[0]+1]/10; 47 xy[xy[0]+1]%=10; 48 xy[0]++; 49 } 50 for (i=1;i<=xy[0];i++) a[i]=xy[i]; 51 a[0]=xy[0]; 52 add(); 53 } 54 for (i=s[0];i>=1;i--) cout<<s[i]; 55 return 0; 56 }