P1009 阶乘之和
题目描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入输出格式
输入格式:
一个正整数N。
输出格式:
一个正整数S,表示计算结果。
输入输出样例
输入样例#1:
复制
3
输出样例#1:
复制
9
高精加+高精乘
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 1000010 using namespace std; int l1,l2,n,ans1[N],ans2[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int work1(int x) { for(int i=1;i<=l1;i++) ans1[i]*=x; for(int i=1;i<=l1;i++) ans1[i+1]+=ans1[i]/10,ans1[i]%=10; while(ans1[l1+1]) ++l1; while(ans1[l1]>9) ans1[l1+1]=ans1[l1]/10,ans1[l1]%=10,++l1; while(!ans1[l1]) l1--; } int work2() { for(int i=1;i<=l2;i++) { ans2[i]+=ans1[i]; ans2[i+1]+=ans2[i]/10; ans2[i]=ans2[i]%10; } while(l2<l1) { ans2[++l2]+=ans1[l2]; ans2[l2+1]+=ans2[l2]/10; ans2[l2]=ans2[l2]%10; } while(ans2[l2+1]) ++l2; while(ans2[l2+1]>9) ans2[l2+1]=ans2[l2]/10,ans2[l2]%=10,++l2; while(!ans2[l2]) --l2; } int main() { n=read();ans1[1]=1; l1=l2=1; for(int i=1;i<=n;i++) { work1(i); work2(); } for(int i=l2;i>=1;i--) printf("%d",ans2[i]); return 0; }