UOJ Logo UOJ_Vixbob的博客

博客

N的阶乘和

2017-08-09 18:32:03 By UOJ_Vixbob

高精度:N的阶乘和

总时间限制: 1000ms 内存限制: 65536kB

描述

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

其中“!”表示阶乘,例如:5!=54321。

输入正整数N,输出计算结果S。

输入

一个正整数N。

输出

计算结果S。

样例输入

5

样例输出

153

来源

NOIP1998复赛 普及组 第二题

原题出处:OPJ

解题思路:用两个数组,两个数组尽量开大一点,一个用来存每一次的阶乘值,另一个用来存和,每一次不断累加

代码如下

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a[40000],S[40000];
int main()
{
    int n,i,j,sum=1,sum1=1,f=0,t;
    a[0]=1;
    scanf("%d",&n);
    if(n>=1)
    {
        for(i=1;i<=n;i++)
        {
            for(j=0;j<sum;j++)
                a[j]=a[j]*i;
            for(j=0;j<sum;j++)
                if(a[j]>=10)
                {
                    a[j+1]=a[j+1]+a[j]/10;
                    a[j]=a[j]%10;
                    if(j+1==sum)sum++;
                }
            for(j=0;j<sum1+10;j++)
                S[j]=S[j]+a[j];
            for(j=0;j<sum1+10;j++)
                if(S[j]>=10)
                {
                    S[j+1]=S[j+1]+S[j]/10;
                    S[j]=S[j]%10;
                    if(j+1==sum1)sum1++;
                }
        }
        for(j=sum1+20;j>=0;j--)
        {
            if(f==0)
            {
                if(S[j]==0);
                else {printf("%d",S[j]);f=1;t=j;}
            }
            if(f==1&&f==1&&t!=j)printf("%d",S[j]);
        }
    }
    else printf("0");
    return 0;
}

评论

Alextokc
要不语法高亮?..
vegchicken
同意楼主以下观点 5!=54321
xlj
同意楼主以下观点 5!=54321

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。