C语言高精度求阶乘之和(利用数组)思路整理。
题目描述
用高精度计算出 S=1!+2!+3!+⋯+n!
其中“!”表示阶乘,例如:5!=5×4×3×2×1
基本思路:利用数组模拟,数组的位置代表不同的位
例如:fac[1]代表个位,fac[2]代表十位,感觉有点类似数学中的列竖式计算。
#include<stdio.h>
#define LEN 10000
int main()
{
int fac[LEN]={0};//求阶乘的数组
int sum[LEN]={0};//依次存储阶乘之和的数组
int i,j,k; //计数的变量
int n; //最后一个阶乘
scanf("%d",&n);
if(n==1){ //先考虑1的阶乘,初始化1的值
printf("%d",1);
return 0; //设置一个出口
}
int x=0; //x为进位的数
fac[1]=1; //初始化1的阶乘,并从2的阶乘的和开始
for(i=1;i<=n;i++){ //外层的循环保证算出各个数阶乘的值
for(j=1;j<=LEN;j++){ //里层的循环算出当前数的阶乘
fac[j]=fac[j]*i+x; //当前储存的是j-1的阶乘,令每个一位上的数同乘j
x=fac[j]/10; //x为int型,求出进位的数
fac[j]=fac[j]%10; //更新当前数
}
for(k=1;k<=LEN;k++){ //求和,每求出一个阶乘加一次
sum[k]=sum[k]+fac[k];
if(sum[k]>=10){ //进位
sum[k+1]+=1;
sum[k]=sum[k]%10;
}
}
}
for(i=LEN;i>=1;i--){ //求出应当输出的数字所在位置
if(sum[i]!=0)
break;
}
for(j=i;j>=1;j--){ //倒序输出
printf("%d",sum[j]);
}
return 0;
}
总结:大体来说,解这道题最重要的是要理解如何用数组模拟阶乘,其他的都是细节上的东西。