问题 I: 【高精度】阶乘和
时间限制: 1 Sec 内存限制: 64 MB提交: 4 解决: 4
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
已知正整数N(N≤200),设S=1!+2!+3!+…N!,其中“!”表示阶乘,即N!=1×2×3×…×(N-l)×N,如:3 1=1×2×3…6。请编程实现:输入正整数N,计算结果S的值。
输入
一个正整数N(N≤200)。
输出
阶乘和。
样例输入
4
样例输出
33
高精度加法与高精度阶乘结合
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int nn,a[100005],b[100005]; 7 string fun_plus(string s,string t) 8 { 9 string res; 10 int len_s=s.size(),len_t=t.size(); 11 int len=max(len_s,len_t); 12 memset(a,0,sizeof(a)); 13 memset(b,0,sizeof(b)); 14 for(int i=len_s-1;i>=0;i--) a[len_s-i-1]=s[i]-'0'; 15 for(int i=len_t-1;i>=0;i--) b[len_t-i-1]=t[i]-'0'; 16 for(int i=0;i<len;i++) 17 { 18 a[i]+=b[i]; 19 a[i+1]+=a[i]/10; 20 a[i]%=10; 21 } 22 while(a[len]==0) len--; 23 for(int i=len;i>=0;i--) res+=a[i]+'0'; 24 return res; 25 } 26 string fun_multi(int n) 27 { 28 string res; 29 if(n==0) return "1"; 30 memset(a,0,sizeof(a)); 31 int cnt=0,m=n; 32 while(m) a[cnt++]=m%10,m/=10; 33 for(int i=n-1;i>=2;i--) 34 { 35 int w=0; 36 for(int j=0;j<cnt;j++) 37 { 38 a[j]=a[j]*i+w; 39 w=a[j]/10;//此处顺序不能改变 40 a[j]%=10; 41 } 42 while(w) 43 { 44 a[cnt++]=w%10; 45 w/=10; 46 } 47 } 48 while(!a[cnt]) cnt--; 49 for(int i=cnt;i>=0;i--) 50 res+=a[i]+'0'; 51 return res; 52 } 53 int main() 54 { 55 cin>>nn; 56 string ans,temp; 57 for(int i=1;i<=nn;i++) 58 { 59 temp=fun_multi(i); 60 ans=fun_plus(temp,ans); 61 } 62 cout<<ans<<endl; 63 return 0; 64 }