#include<stdio.h>
int main()
{
int i,j,m,q,b;
int n = 0,count = 0;
scanf("%d",&q);//输入
int sum[200];
for(i=0;i<200;i++)//构建一个数组来存储最终的结果
{
sum[i] = 0;
}
int k = 0;//用来定位有效内容的下标
for(m=1;m<=q;m++)//生成“1!+2!+......+q!中1至q的数
{
int arr[200];//用来存储每一次阶乘的值
for(i=0;i<200;i++)
{
arr[i] = 0;
}
arr[0] = 1;//初始化为1,让后续可以进行运算
for(i=1;i<=m;i++)//阶乘是1*2*3*....*q的值,所以这里生成1至q各自的阶乘数
{
for(j=0;j<=k;j++)//对每一位进行乘法,类似于竖列数学运算
{
arr[j] *= i;
}
for(j=0;j<=k;j++)//判断每一位是否需要进位
{
if(arr[j]>9)
{
if(j==k)//如果最高位需要进位,则有效数组的下标需要增加一位
{
k++;
}
arr[j+1] += arr[j]/10;//整除进位
arr[j] = arr[j]%10;//取余
}
}
}
for(b=0;b<=k;b++)//将每一次阶乘的结果存储进SUM数组之中
{
sum[b]=arr[b]+sum[b];
}
for(i=0;i<=k;i++)//同上,再次判断每一位是否需要进位
{
if(sum[i]>9)
{
sum[i+1] += sum[i]/10;
sum[i] = sum[i]%10;
}
}
}
for(i=199;i>=0;i--)//判断最终的位数
{
if(sum[i]!= 0)
{
count = i;
break;
}
}
for(b=count;b>=0;b--)//倒序取出每一位
{
printf("%d",sum[b]);
}
return 0;
}
N个阶乘之和的算法(1!+2!+3!+......+n!)
![](https://img-home.csdnimg.cn/images/20240711042549.png)