洛谷 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> using namespace std; int n,ans[10000]; struct nond{ int num[10000]; }v[51]; void cheng(int pos,int num1[500]){ for(int i=0;i<=num1[0];i++) v[pos].num[i]=num1[i]; for(int i=1;i<=num1[0];i++) v[pos].num[i]*=pos; for(int i=1;i<=num1[0];i++) if(v[pos].num[i]>=10){ if(i==num1[0]) num1[0]++; v[pos].num[i+1]+=v[pos].num[i]/10; v[pos].num[i]%=10; } for(;num1[0]>=1;num1[0]--) if(v[pos].num[num1[0]]!=0) break; v[pos].num[0]=num1[0]; } void jia(int pos){ ans[0]=max(ans[0],v[pos].num[0]); for(int i=1;i<=ans[0];i++) ans[i]+=v[pos].num[i]; for(int i=1;i<=ans[0];i++) if(ans[i]>=10){ if(i==ans[0]) ans[0]++; ans[i+1]+=1; ans[i]%=10; } for(;ans[0]>=1;ans[0]--) if(ans[ans[0]]!=0) break; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) v[i].num[0]=1,v[i].num[1]=1; for(int i=2;i<=n;i++) cheng(i,v[i-1].num); for(int i=1;i<=n;i++) jia(i); for(int i=ans[0];i>=1;i--) cout<<ans[i]; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。