zoukankan      html  css  js  c++  java
  • 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;
        }
     } 
  • 相关阅读:
    SAMBA服务初学练习
    NFS与AutoNFS实例
    NTP服务简介
    DHCP服务简单搭建步骤
    HBase文档操作--练习篇
    Hadoop体系结构管理
    HBase表结构设计--练习篇
    HBase备份恢复练习
    MongoDB管理练习
    24_BlockingQueue接口
  • 原文地址:https://www.cnblogs.com/wisdom-jie/p/13583336.html
Copyright © 2011-2022 走看看