P1009 阶乘之和

P1009 阶乘之和

  • 题目提供者洛谷OnlineJudge
  • 标签数论(数学相关)高精1998NOIp提高组NOIp普及组
  • 难度普及-
  • 通过/提交1139/3791

提交该题 讨论 题解 记录

题目描述

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

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

输入输出格式

输入格式:

一个正整数N。

输出格式:

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

输入输出样例

输入样例#1:
3
输出样例#1:
9
#include<iostream>
#include<cstring>
using namespace std;
int a[100000],n,i,j,x[100000],y[100000];
void add()//处理进位
{
    memset(x,0,sizeof(x));
    x[0]=max(y[0],a[0]);
    for(i=1;i<=x[0];i++){x[i]+=y[i]+a[i],x[i+1]=x[i]/10,x[i]%=10;}
    while(x[x[0]+1]>0){x[x[0]+2]=x[x[0]+1]/10,x[x[0]+1]%=10,x[0]++;}
    y[0]=x[0];
    for(i=1;i<=x[0];i++){y[i]=x[i];}
}
int main()
{
    cin>>n;
    a[0]=1,a[1]=1,y[0]=1,y[1]=0;
    for(j=1;j<=n;j++)
    {
        memset(x,0,sizeof(x));//清空阶乘数组
        x[0]=a[0];
        for(i=1;i<=a[0];i++){x[i]+=a[i]*j,x[i+1]=x[i]/10,x[i]%=10;}//模拟阶乘
        while(x[x[0]+1]>0){x[x[0]+2]=x[x[0]+1]/10,x[x[0]+1]%=10,x[0]++;}//加上阶乘
        for(i=1;i<=x[0];i++){a[i]=x[i];}
        a[0]=x[0];
        add();
    }
    for(i=y[0];i>=1;i--){cout<<y[i];}//倒序存储就要倒序输出
    return 0;
}
原文地址:https://www.cnblogs.com/shenben/p/5638288.html