题目:https://www.luogu.org/problemnew/show/P1009
算法分析:
1.先是要算n!=1*2*3*......*n,用一个数组存储,利用高精度算出,主要是要注意进位和最高位的处理。
2.再计算1!+2!+3!+......+n!,用之前的数组的值给另一个专门加和的数组,同样也是利用高精度算出,也要要注意进位和最高位的处理。
3.用for循环去除多余的前导0。
4.最后输出就大功告成了~~!
#include<bits/stdc++.h>//这是“万能头文件”哦~
int a[40002]={0,1},s[40002]={0};
int main()
{
int i,n,alen=1,j,slen=1,k,l=1,v=1;
scanf("%d",&n);
for(k=1;k<=n;k++)
{
for(j=1;j<=alen;j++)//这里在乘.....
a[j]*=l;
for(j=1;j<=alen;j++)//这里在处理进位,要注意哦~
{
if(a[j]>=10)
{
a[j+1]+=a[j]/10;
a[j]%=10;
v++;
}
}
alen++;
while(a[alen]>=10)//这就是在处理最高位
{
a[alen+1]=a[alen]/10;
a[alen]%=10;
alen++;
v++;
}
l++;
slen=slen>alen?slen:alen;//v与slen都是在处理加和数组的最高位
for(i=1;i<=slen;i++)//开始做加法啦!
{
s[i]+=a[i];
if(s[i]>=10)
{
if(i==slen)
slen++;
s[i]%=10;
s[i+1]++;
}
}
alen=v;
}
for(i=slen;i>=1;i--)//去除前导0
{
if(s[i]==0&&slen>1)
slen--;
else
break;
}
for(i=slen;i>=1;i--)//最后一步:输出!printf("%d",s[i]);
return 0;//完啦!
}