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