高精度阶乘和

题目详情
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
#include
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.
            }
        }
    }
}

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

你可能感兴趣的:(水题)