题目描述
用高精度计算出 S=1!+2!+3!+…+n! (n≤50)
其中“!”表示阶乘,例如: 5!=5×4×3×2×1 。
输入输出格式
输入格式:
一个正整数 N 。
输出格式:
一个正整数 S ,表示计算结果。
输入输出样例
输入样例#1: 复制
3
输出样例#1: 复制
9
简单的大数相加和大数相乘。
AC代码:
1 #include<iostream> 2 #include<sstream> 3 #include<algorithm> 4 #include<cstring> 5 #include<iomanip> 6 #include<vector> 7 #include<cmath> 8 #include<stack> 9 using namespace std; 10 string lan_add(string a,string b)//large number addition 11 { 12 int la=a.length(),lb=b.length(); 13 //将字符串中字符转化为数字并倒序存储 14 int l=max(la,lb)+1,num1[l],num2[l]; 15 memset(num1,0,sizeof(num1)); 16 memset(num2,0,sizeof(num2)); 17 for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0'; 18 for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0'; 19 //la长度的数与lb长度的数之和长度不会超过max(la+lb)+1 ,模拟加法 20 int c[l]={0}; 21 for(int i=0;i<l;i++) c[i]=num1[i]+num2[i]; 22 //处理进位 23 int carry=0; 24 for(int i=0;i<l;i++) 25 { 26 c[i]+=carry; 27 carry=c[i]/10; 28 c[i]%=10; 29 } 30 31 string ans; 32 for(int i=l-1;i>=0;i--) ans+=c[i]+'0'; 33 while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0 34 return ans; 35 } 36 string lan_mul(string a,string b)//large number multiplication 37 { 38 int la=a.length(),lb=b.length(); 39 //将字符串中字符转化为数字并倒序存储 40 int num1[la],num2[lb]; 41 for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0'; 42 for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0'; 43 //la长度的数和lb长度的数乘积长度不会超过la+lb ,模拟乘法 44 int c[la+lb]={0}; 45 for(int i=0;i<la;i++) 46 for(int j=0;j<lb;j++) 47 c[i+j]+=num1[i]*num2[j]; 48 //处理进位 49 int carry=0; 50 for(int i=0;i<la+lb;i++) 51 { 52 c[i]+=carry; 53 carry=c[i]/10; 54 c[i]%=10; 55 } 56 57 string ans; 58 for(int i=la+lb-1;i>=0;i--) 59 ans+=c[i]+'0'; 60 while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0 61 return ans; 62 } 63 string to_str(int n)//将整数转化为字符串 64 { 65 string ans; 66 stringstream ss; 67 ss<<n; 68 ss>>ans; 69 return ans; 70 } 71 int main() 72 { 73 int N;cin>>N; 74 string result="0",temp="1"; 75 for(int i=1;i<=N;i++) 76 { 77 temp=lan_mul(temp,to_str(i)); 78 result=lan_add(result,temp); 79 } 80 cout<<result; 81 }