用高精度计算出 S = 1! + 2! + 3! +…+ n!S=1!+2!+3!+⋯+n!(n≤50)。
其中“!”表示阶乘,例如:5! = 5 * 4 *3 *2 *1;
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
3
9
说明
对于 100% 的数据1≤n≤50。
代码如下
#include<bits/stdc++.h>
using namespace std;
int main(void) {
int a[505];//存储每层的数据
int b[505];//倒序存储答案
int x;
cin>>x;
memset(b,0,sizeof(b));
for(int n=1; n<=x; ++n) {
memset(a,0,sizeof(a));
a[0]=1;
int len=0;//初始设置长度为0
for(int i=1; i<=n; ++i) {//先进行数组a的高精乘
for(int l=0; l<=len; ++l) {//每一位都与i相乘
a[l]*=i;
}
for(int l=0; l<len; ++l) {//大于10的进位
if(a[l]>10) {
a[l+1]+=a[l]/10;
a[l]%=10;
}
}
while(a[len]>10) {//当相乘的数较大时,需要用while,而不是用if
a[len+1]+=a[len]/10;
a[len]%=10;
len++;
}
}//将a与b数组相加
for(int i=0; i<=len; ++i) {
b[i]+=a[i];
}
for(int i=0; i<=len; ++i) {//仍是进位操作
if(b[i]>=10) {
b[i+1]+=1;
b[i]%=10;
}
}
}
int flag=0;
for(int i=500; i>=0; --i) {//倒序输出
if(flag) {
cout<<b[i];
} else {
if(a[i]!=0) {
flag=1;
cout<<b[i];
}
}
}
return 0;
}