这个题要用到高精度算法,刚开始我想的思路比较粗暴,在题解中看了下大佬的代码,发现这样写要简便容易地多,刚开始还没有看懂,还是看了好半天才理解 太菜咯~ TnT。
下面的代码思路就是首先通过一层循环遍历从1~n的阶乘,用a数组计算存储每次阶乘后得到结果的各位数,用sum数组存储每次阶乘后和的最终结果,这里的思路我觉得比较好的点就是这里:从1~n阶乘的计算是通过上一次循环的结果再乘以i来计算的
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n,carry=0,i,j;
int sum[101],a[101];
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
sum[0]=1;
a[0]=1;
cin>>n;
if(n==1)
cout<<"1";
for(i=2;i<=n;i++)
{
for(j=0;j<100;j++)
{
a[j]*=i;
}
for(j=0;j<100;j++)
{
//carry存储进位
a[j]=carry+a[j];
carry=a[j]/10;
a[j] %= 10;
}
for(j=0;j<100;j++)
{
sum[j] += a[j];
if(sum[j] > 9)
{
sum[j+1] += sum[j]/10;
sum[j] %= 10;
}
}
}
for(i=99;i>0 && sum[i]==0;i--); //排除前面为0的项
for(j=i;j>=0;j--) cout<<sum[j];
return 0;
}