#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=510;
char re[MAXN];
struct Big{
int s[MAXN],len;
Big():len(1){memset(s,0,sizeof(s));}
void read()
{
scanf("%s",re);
int n=strlen(re);
len=(n-1)/4+1;int x=len,k=0;
while('0'<=re[k]&&re[k]<='9')
{
if(k&&k%4==n%4)x--;
s[x]=s[x]*10+re[k]-'0';
++k;
}
}
void print()
{
for(int i=len;i>=1;--i)
{
if(i!=len)printf("%04d",s[i]);
else printf("%d",s[i]);
}
}
Big& operator +=(Big &a)
{
int n=max(a.len,len);
for(int i=1;i<=n;++i)
s[i]+=a.s[i],s[i+1]+=s[i]/10000,s[i]%=10000;
while(s[len+1])len++;
return *this;
}
Big& operator *=(Big &a)
{
for(int i=len;i;--i)
{
for(int j=a.len;j-1;--j)
s[i+j-1]+=s[i]*a.s[j];
s[i]=s[i]*a.s[1];
int k=i;
while(s[k])
s[k+1]+=s[k]/10000,s[k]%=10000,++k;
}
while(s[len+1])len++;
return *this;
}
};
bool operator <(Big &a,Big &b)
{
if(a.len!=b.len)return a.len<b.len;
for(int i=a.len;i>=1;--i)
if(a.s[i]!=b.s[i])return a.s[i]<b.s[i];
return false;
}
Big operator * (Big &a,Big &b)
{
Big c=a;
return c*=b;
}
Big operator + (Big &a,Big &b)
{
Big c=a;
return c+=b;
}
int main()
{
Big sum,x,i,dz,lim;
dz.s[1]=i.s[1]=x.s[1]=1;
lim.s[1]=101;
for(;i<lim;i+=dz)
sum+=x*=i;//从右往左运算,相当于x=x*i;sum=sum+x;
sum.print();
}
楼上用int的,自然溢出运行出来应该会是负数或者0.....题主以后如果出阶乘题数据要小
运行结果: