高精度阶乘和

  • Post author:
  • Post category:其他



题目详情


15:阶乘和

查看 提交 统计 提问

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

描述

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

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

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

输入

一个正整数N。

输出

计算结果S。

样例输入

5

样例输出

153

来源

NOIP1998复赛 普及组 第二题

高精度的主要思想就是用多个数组来存数字,读入用字符串。

然后转成一位一个数组的整数数组。

但是这题并不需要读入,于是我们可以节约一点空间,

一个数组存5位(如果你喜欢,存更多位也可以,不过不能超int)

#include<iostream>
#include<cstdio>
using namespace std;
int a[39900];
int x;
int j,n;
void pig(int f)
{
    for(int i=0;i<=x;i++)
    {
        if(a[i]>=100000)
        {
            a[i+1]+=a[i]/100000;
            a[i]=a[i]%100000;
            if(i==x)
            x++;
        }
        a[i]*=f;
    }
    a[0]+=f;//若f(n)=n!+(n-1)!+...+1!,则有(n+1)!=f(n)*n+n=(f(n)+1)*n.
}
int main()
{
    scanf("%d",&a[0]);
    for(int y=a[0]-1;y>=1;y--)
    {
        pig(y);
    }
    for(int i=0;i<=x;i++)
    {
        if(a[i]>=100000)
        {
            a[i+1]+=a[i]/100000;
            a[i]=a[i]%100000;
            if(i==x)
            x++;
        }
    }
    for(int i=x+1;i>=0;i--)//不可能超过x+1位。
    {
        if(a[i])
        {
            printf("%d",a[i]);//没有前导0
            for(i--;i>=0;i--)
            {
                printf("%.5d",a[i]);//后面得5位的输出,没有就前面补0.
            }
        }
    }
}

另外,我是不会给完代码就走人的,这题还可以用重载运算符:


重载运算符



版权声明:本文为qq_35950004原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。