注意:由于数据出现溢出,所以要自己实现“*”运算和“+”运算
#include<stdio.h>
#define MAX_SIZE 3000
#define MAX_POS 2999
int result[MAX_SIZE]={0},res_begin=MAX_POS;
//"+"
void Get_Sum(int all[],int begin){
int end=MAX_POS;
int temp=0,sum;
while(end>=begin){
result[end]+=all[end];
temp=end;
while(result[temp]>=10){
sum=0;
while(result[temp]>=10){
sum++;
result[temp]-=10;
}
temp--;
result[temp]+=sum;
}
if(temp<res_begin){
res_begin=temp;
}
end--;
}
}
//"!"
void Get_Factorial (const int N){
int factorial[MAX_SIZE];
for(int i=0; i<MAX_SIZE; i++)
factorial[i]=-1;
factorial[MAX_POS]=1;
int begin=MAX_POS;
for(int i=N; i>=2; i--){
int startIndex=MAX_POS;
int temp=0;
while(factorial[startIndex]!=-1){
int total=i*factorial[startIndex]+temp;
factorial[startIndex]=total%10;
startIndex--;
temp=total/10;
}
while(temp!=0){
if(factorial[startIndex]!=-1){
temp+=factorial[startIndex];
}
factorial[startIndex]=temp%10;
temp/=10;
begin=startIndex;
startIndex--;
}
}
Get_Sum(factorial,begin);
}
int main() {
int i;
for(i=1; i<=20; i++){
Get_Factorial(i);
}
while(res_begin<=MAX_POS){
printf("%d",result[res_begin++]);
}
return 0;
}