高精阶乘求和,50分不通过

P1009 [NOIP1998 普及组] 阶乘之和
题目描述
用高精度计算出 =1!+2!+3!+⋯+!S=1!+2!+3!+⋯+n!(≤50n≤50)。
输入格式
一个正整数
n。

输出格式
一个正整数
S,表示计算结果。

输入输出样例
输入 #1复制
3
输出 #1复制
9
说明/提示
【数据范围】
对于
100% 的数据,
1≤n≤50

#include<bits/stdc++.h>
using namespace std;
int a[100000],r[100000];
void jia(int a1[],int b1[])
{
    int i,x;
    x=0;
    a1[0]++;
    for(i=1;i<=a1[0];i++){
        a1[i]=a1[i]+b1[i]+x,
        x=a1[i]/10,
        a1[i]%=10;
    }
    while(a1[a1[0]]==0&&a1[0]>0) a1[0]--;
    return ;
}
int main()
{
    int n,i,j,l;
    cin>>n;
    a[0]=a[1]=1; 
    int x=0;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=a[0];j++){
            a[j]=a[j]*i+x,x=a[j]/10,a[j]%=10;
        }
        while(x) a[++a[0]]=x%10,x/=10;
        jia(r,a);
     } 
     for(i=r[0];i>0;i--)
       cout<<r[i];
    return 0;
}

有没有把高精阶乘玩得比较懂的,来告诉我一下我为什么能只能拿到50分。

可以试试此代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
struct fantastic     //嗯,开始重载了
{
    int len,s[9999];
    fantastic()
    {
        memset(s,0,sizeof(s));
        len=1;
    }
    fantastic operator=(const char*num)
    {
        len=strlen(num);
        for(int i=0;i<len;++i)
            s[i]=num[len-i-1]-'0';
        return *this;
    }
    fantastic operator=(const int num)
    {
        char a[9999];
        sprintf(a,"%d",num);
        *this=a;
        return *this;
    }
    fantastic (const int num)
    {
        *this=num;
    }
    fantastic (const char * num)
    {
        *this=num;
    }
    fantastic operator+(const fantastic &a)   //这里在重载 “+” 的运算
    {
        fantastic c;
        c.len=max(len,a.len)+1;                //这里就是我们熟悉的竖式模拟了
        for(int i=0,x=0;i<c.len;++i)
        {
            c.s[i]=s[i]+a.s[i]+x;
            x=c.s[i]/10;
            c.s[i]=c.s[i]%10;
        }
        if(c.s[c.len-1]==0)
            --c.len;
        return c;
    }
    fantastic operator * (const fantastic &x)           //然后再来波 “*” 的运算
    {
        fantastic c;
        c.len=len+x.len;                 //又是我们熟悉的竖式模拟
        for(int i=0;i<len;++i)
            for(int j=0;j<x.len;++j)
            {
                c.s[i+j]+=s[i]*x.s[j];
                c.s[i+j+1]+=c.s[i+j]/10;
                c.s[i+j]%=10;
            }
        if(c.s[c.len-1]==0)
            --c.len;
        return c;
    }
};
ostream& operator<<(ostream &out,const fantastic& x)   //重载一下输出
{
    for(int i=x.len-1;i>=0;--i)
        cout<<x.s[i];
    return out;
}
istream& operator>>(istream &in,fantastic &x)       //重载一下输入
{
    char num[9999];
    in>>num;
    x=num;
    return in;
}
int main()         //然后就可以愉快的开始主程序啦
{
    int n;
    fantastic ans=0,num=1;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        num=num*i;
        ans=ans+num;
    }
    cout<<ans<<endl;
}