题目描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5×4×3×2×1
输入格式
一个正整数N。
输出格式
一个正整数S,表示计算结果。
输入输出样例
输入 #1
3
输出 #1
9
#include<stdio.h>
int sum[1000]={0};//记录总和,即为所求
int a[1000]={0};//记录每次乘法后每位个位数
int ans=1;//记录加法位数
void fac(int n){//传入一个整数,计算这个整数的阶乘,然后再把阶乘结果与之前计算的和累加在一起。
int i,m;
int ans1=1;//记录乘法结果位数
a[1]=1;//从1开始
for(i=1;i<=n;i++){//阶乘开始 i从1逐渐增大到n
int carry=0,j;//carry记录进位,初始进位为0
for(j=1;j<=ans1;j++){
m=a[j]*i+carry;//从个位逐位乘,再加上低位传来的进位
a[j]=m%10; //将结果的余数留在低位
carry=m/10;//结果的商进位
}
while(carry!=0){//进位可能不止是1
a[j]=carry%10;
carry/=10;
j++;
ans1++;//位数增加
}
}
//以上计算的是n的阶乘,以下开始累加
int carry=0,temp;//进位,暂存结果
for(i=1;i<=ans1||i<=ans;i++){/*加法(i是加法位数,如果n的阶乘结果位数
小于之前累加和的位数,则只需要加到阶乘结果最高位即可,反之,则多余的数值
都会放在进位中,所以只需要进行较少位数即可)*/
temp=a[i]+sum[i]+carry;
sum[i]=temp%10;
carry=temp/10;
}
if(carry!=0){
sum[i]=carry;
ans++;
}
}
int main(){
int i,n,k;
scanf("%d",&n);
for(i=1;i<=n;i++){
fac(i);//进行n次阶乘的运算
}
for (k = 1000; k > 0; k--) {
if (sum[k] != 0)break;//去除多余的零
}
for (; k>= 1; k--) {
printf("%d", sum[k]);//倒序输出
}
return 0;
}