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; }