题目描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入输出格式
输入格式:
一个正整数N。
输出格式:
一个正整数S,表示计算结果。
输入输出样例
输入样例#1:
3
输出样例#1:
9
#include<cstdio>
#include<cstring>
char result[55][20000];
int resultLen[55];
int N;
char str1[20000];
char ans[20000],str3[20000];
void add(char str1[20000], int n1, char str2[20000], int n2, char str3[20000], int &n3)
{
int i,val,jinwei,max;
if(n1<=n2)
{
max=n2;
for(i=n1;i<n2;i++)
str1[i]=0;
}
else
{
max=n1;
for(i=n2;i<n1;i++)
str2[i]=0;
}
jinwei=0;
for(i=0; i<max; i++)
{
val=str1[i]+str2[i]+jinwei;
jinwei=val/100;
val=val%100;
str3[i]=val;
}
str3[max]=jinwei;
if(jinwei>0)
n3=max+1;
else
n3=max;
}
void multi1(char str1[100], int &n1, int s2)
{
int i,val,jinwei=0;
for(i=0;i<n1;i++)
{
val=str1[i]*s2+jinwei;
jinwei=val/100;
str1[i]=val%100;
}
str1[n1]=jinwei;
if(jinwei>0)
n1++;
}
int main()
{
int n3;
int i,j,n1,k;
scanf("%d",&N);
result[1][0]=1;
resultLen[1]=1;
for(str1[0]=1,n1=1,i=2;i<=N;i++)
{
multi1(str1, n1, i);
for(j=0;j<n1;j++)
result[i][j]=str1[j];
resultLen[i]=n1;
}
ans[0]=1;
n1=1;
for(i=2;i<=N;i++)
{
add(ans, n1, result[i], resultLen[i], str3, n3);
for(j=0;j<n3;j++)
ans[j]=str3[j];
n1=n3;
}
printf("%d",ans[n1-1]);
for(k=1;k<n1;k++)
printf("%d%d",ans[n1-1-k]/10,ans[n1-1-k]%10);
return 0;//此行必须是返回0,如果填其它数字,系统直接 RE报错
}