题目描述
用高精度计算出 S=1!+2!+3!+…+n! (n≤50)
其中“!”表示阶乘,例如: 5!=5×4×3×2×1 。
输入输出格式
输入格式:
一个正整数 N 。
输出格式:
一个正整数 S ,表示计算结果。
输入输出样例
输入样例#1: 复制
3
输出样例#1: 复制
9
简单的大数相加和大数相乘。
AC代码:
#include<iostream>
#include<sstream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<stack>
using namespace std;
string lan_add(string a,string b)//large number addition
{
int la=a.length(),lb=b.length();
//将字符串中字符转化为数字并倒序存储
int l=max(la,lb)+1,num1[l],num2[l];
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0';
for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0';
//la长度的数与lb长度的数之和长度不会超过max(la+lb)+1 ,模拟加法
int c[l]={0};
for(int i=0;i<l;i++) c[i]=num1[i]+num2[i];
//处理进位
int carry=0;
for(int i=0;i<l;i++)
{
c[i]+=carry;
carry=c[i]/10;
c[i]%=10;
}
string ans;
for(int i=l-1;i>=0;i--) ans+=c[i]+'0';
while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0
return ans;
}
string lan_mul(string a,string b)//large number multiplication
{
int la=a.length(),lb=b.length();
//将字符串中字符转化为数字并倒序存储
int num1[la],num2[lb];
for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0';
for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0';
//la长度的数和lb长度的数乘积长度不会超过la+lb ,模拟乘法
int c[la+lb]={0};
for(int i=0;i<la;i++)
for(int j=0;j<lb;j++)
c[i+j]+=num1[i]*num2[j];
//处理进位
int carry=0;
for(int i=0;i<la+lb;i++)
{
c[i]+=carry;
carry=c[i]/10;
c[i]%=10;
}
string ans;
for(int i=la+lb-1;i>=0;i--)
ans+=c[i]+'0';
while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0
return ans;
}
string to_str(int n)//将整数转化为字符串
{
string ans;
stringstream ss;
ss<<n;
ss>>ans;
return ans;
}
int main()
{
int N;cin>>N;
string result="0",temp="1";
for(int i=1;i<=N;i++)
{
temp=lan_mul(temp,to_str(i));
result=lan_add(result,temp);
}
cout<<result;
}