1173:阶乘和
时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6674 通过数: 3397 【题目描述】 用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。
输入正整数n,输出计算结果S。
【输入】 一个正整数n。
【输出】 计算结果S。
【输入样例】 5 【输出样例】 153 提交 统计信息 提交记录
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int a[501]={0,1},b[501],c[501]; // a数组用于计算阶乘(被加数) b数组:加数 c数组:计算每次累加和 int lena=1,lenb=1,lenc=1; int main() { int n; cin>>n; for(int i=1;i<=n;i++) //计算n次 { for(int j=1;j<=lena;j++) // 13~25行:计算每个数的阶乘结果 { a[j]*=i; } for(int k=1;k<=lena;k++) { if(a[k]>9) { a[k+1]+=a[k]/10; a[k]%=10; if(k==lena) lena++; } } int x=0,w=1; // 27~37行计算每个阶乘每次累加和 while(w<=lena || w<=lenb) { c[w]+=a[w]+b[w]+x; x=c[w]/10; c[w]%=10; w++; } c[w]=x; if(c[w]==0) w--; lenc=w; memcpy(b,c,sizeof(c)); // 每次求和后把结果重新赋给b数组,和下一个阶乘重新计算 lenb=lenc; // 同时把长度也赋给b数组 memset(c,0,sizeof(c)); // c数组这时要清零 } for(int i=lenb;i>=1;i--) // 倒序输出最后结果 { cout<<b[i]; } cout<<endl; return 0; }