题目描述
用高精度计算出 S = 1!+2!+3!+…+n! (n≤50)
其中“!”表示阶乘,例如:5!=5×4×3×2×1
输入格式
一个正整数N。
输出格式
一个正整数S,表示计算结果。
输入输出样例
3 —> 9
思路
这是个高精度的简单考察。
关于高精度,不了解的可以看【入门】高精度算法。作者写的简直不要太清楚。
代码
#include<stdio.h>
int item[100000]={0}; //定义两个全局数组,若局部定义则无法运行
int sum[500000]={0};
int main()
{
int i,N,len_i=1,j,len_sum=1; //len_i为当前阶乘数组长度,len_sum为总和长度
scanf("%d",&N);
item[1] = 1;
for(i=1;i<=N;i++) //从1~n的阶乘就是1~n的循环对应
{
for(j=1;j<=len_i;j++) //所有位*当前阶乘数
{
item[j]*=i;
}
for(j=1;j<=len_i;j++) //当前数组进位为标准形式
{
item[j+1]+= item[j]/10;
item[j]%=10;
if(j==len_i&&item[j+1]!=0) //向下一位进位会导致len_i的变化,此条件语句就是让其能一直更新
{
while(item[len_i+1]!=0)
len_i++;
}
}
for(j=1;j<=len_i;j++) //总和数组每位依次加上当前数组的位
{
sum[j]+=item[j];
}
for(j=1;j<=len_sum;j++) //一样的进位处理
{
sum[j+1]+= sum[j]/10;
sum[j]%=10;
if(j==len_sum&&sum[j+1]!=0)
{
while(sum[len_sum+1]!=0)
len_sum++;
}
}
}
for(i=len_i;i>=1;i--) //输出
printf("%d",sum[i]);
return 0;
}