1998 阶乘之和
这道题明显是一个高精,而且非常恶心
题目我们就不分析了,比较简单
这道题有很多的步骤
首先我们得先循环枚举每一个1~n的数e,用来算阶乘的和,也就是加数
接下来就是我们把这个数e进行循环将e的因子进行高精诸位相乘,这里需要开一个阶乘数组,数组的第一位要设置成1,因为乘嘛,不能为0.
然后我们再用一个循环进行进位处理
然后再来一个循环用总和数组sum诸位相加
然后还是一个循环进行进位处理
最后我们得把乘积数组a除了第一位全部清零
最后输出
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000;
int n,k,i,j,t;
int a[maxn]={},sum[maxn]={};
int main()
{
cin>>n;
sum[0]=0;
k=1,t=1;//k记录阶乘的长度,t记录阶乘之和的长度
for(int e=1;e<=n;e++)
{//记录1~n的阶乘
a[0]=1;//记录阶乘初始为1
for(i=1;i<=e;i++)
{//阶乘的因子
for(j=0;j<k;j++)
{
a[j]=a[j]*i; //乘起来
//高精相乘
}
for(j=0;j<k;j++)//进位处理
{
if(a[j]>=10)
{
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
if(j==k-1) k++;//进位
}
}
}
for(int p=0;p<k;p++)
{
sum[p]=sum[p]+a[p];//阶乘之和
}
for(int p=0;p<t;p++){//进位处理
if(sum[p+1]>=10){
t++;
}
if(sum[p]>=10){
sum[p+1]+=sum[p]/10;
sum[p]=sum[p]%10;
}
}
for(int q=1;q<k;q++){
a[q]=0;//清零
}
}
for(i=k-1;i>=0;i--){
cout<<sum[i]<<"";
}
cout<<endl;
}