Luogu P1009 阶乘之和

重操旧业啦

题目描述

用高精度计算出S=1!+2!+3!+…+n! (n≤50)

其中“!”表示阶乘,例如:5!=5×4×3×2×1。

输入格式

一个正整数N

输出格式

一个正整数S,表示计算结果。

题解

  一道显然的高精度乘法在做加法,n<13爆做,不爆int。n>=13高精度;

  值得注意的一点是,题目要求求阶乘并加和,写题时容易误写成求阶乘,忘记加和;

  具体注释已经放进了代码里

#include<cstdio>
int a[10005],g[10005],s[10005],b[10005],he[10005];
int main()
{
    int n,i,j,ans,sum=0,ge,shi,jin,t=10;
    scanf("%d",&n);
    if(n<=12)
    {
        for(i=1;i<=n;i++)
        {
            ans=1;
            for(j=1;j<=i;j++)
                ans*=j;
            sum+=ans;
        }
        printf("%d",sum);
        return 0;
    }
    else
    {
        for(i=1;i<=12;i++)
        {
            ans=1;
            for(j=1;j<=i;j++)
                ans*=j;//ans为阶乘 
            sum+=ans;//sum为12以内阶乘和 
        }
        for(i=1;;i++)
        {
            if(sum==0)break;
            a[i]=sum%10;//a数组表示阶乘加和 
            b[i]=ans%10;//b数组表示各数阶乘 
            sum/=10;ans/=10;
        }
        for(j=13;j<=n;j++)//从13开始高精度求阶乘 
        {
            ge=j%10;shi=j/10;jin=0;
            for(i=1;i<=t+10;i++)
            {
                ans=b[i]*ge;
                g[i]=ans%10+jin;//g数组为j的个位乘大数 
                    if(g[i]>=10){g[i]%=10;jin=1;}
                    else jin=0;
                jin+=ans/10;
            }
            jin=0;
            for(i=1;i<=t+10;i++)
            {
                ans=b[i]*shi;
                s[i+1]=ans%10+jin;//s数组为j的十位乘大数 
                    if(s[i]>=10){s[i]%=10;jin=1;}
                    else jin=0;
                jin+=ans/10;
            }
            jin=0;he[1]=g[1];
            for(i=2;i<=t+10;i++)
            {
                he[i]=g[i]+s[i]+jin;
                if(he[i]>=10){he[i]%=10;jin=1;}
                else jin=0;
            }//求和即在he中表示出j的阶乘 
            for(i=1;i<=t+10;i++)
            {
                b[i]=he[i]; //b替换为j的阶乘,方便下次计算 
                a[i]=a[i]+he[i]+jin;
                if(a[i]>=10){a[i]%=10;jin=1;}
                else jin=0; 
            }//再次求和,得出j内阶乘和 
            for(i=1;i<=t+10;i++)
                if(a[i]!=0)t=i;//用t计录答案位数 
        }
        for(i=t;i>=1;i--)
            printf("%d",a[i]);//输出 
        return 0;
    }
 } 
原文地址:https://www.cnblogs.com/wisdom-jie/p/13583336.html