高精度:N的阶乘和
总时间限制: 1000ms 内存限制: 65536kB
描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=54321。
输入正整数N,输出计算结果S。
输入
一个正整数N。
输出
计算结果S。
样例输入
5
样例输出
153
来源
NOIP1998复赛 普及组 第二题
解题思路:用两个数组,两个数组尽量开大一点,一个用来存每一次的阶乘值,另一个用来存和,每一次不断累加
代码如下
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a[40000],S[40000];
int main()
{
int n,i,j,sum=1,sum1=1,f=0,t;
a[0]=1;
scanf("%d",&n);
if(n>=1)
{
for(i=1;i<=n;i++)
{
for(j=0;j<sum;j++)
a[j]=a[j]*i;
for(j=0;j<sum;j++)
if(a[j]>=10)
{
a[j+1]=a[j+1]+a[j]/10;
a[j]=a[j]%10;
if(j+1==sum)sum++;
}
for(j=0;j<sum1+10;j++)
S[j]=S[j]+a[j];
for(j=0;j<sum1+10;j++)
if(S[j]>=10)
{
S[j+1]=S[j+1]+S[j]/10;
S[j]=S[j]%10;
if(j+1==sum1)sum1++;
}
}
for(j=sum1+20;j>=0;j--)
{
if(f==0)
{
if(S[j]==0);
else {printf("%d",S[j]);f=1;t=j;}
}
if(f==1&&f==1&&t!=j)printf("%d",S[j]);
}
}
else printf("0");
return 0;
}