题目描述
用高精度计算出S=1!+2!+3!+⋯+n!(n≤50)。
其中 !
表示阶乘,定义为n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入 #1
3
输出 #1
9
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤50。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n≤20,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。
NOIP1998 普及组 第二题
思路
我的思路就是高精乘+高精加,就是把高精乘的模板套上去接着套高精加的模板求阶乘。
#include<bits/stdc++.h>
using namespace std;
int n,a[101],s[101];
void c(int x)
{
int g=0;
for(int i=100;i>=0;i--)
{
a[i]=a[i]*x+g;
g=a[i]/10;
a[i]=a[i]%10;
}
}
void h(int i)
{
int g=0;
for(i=100;i>=0;i--)
{
s[i]=s[i]+a[i]+g;
g=s[i]/10;
s[i]=s[i]%10;
}
}
void p(int i)
{
int w;
for(i=0;i<=100;i++)
{
if(s[i]!=0)
{
w=i;
break;
}
}
for(int i=w;i<=100;i++)cout<<s[i];
}
int main()
{
cin>>n;
s[100]=a[100]=1;
for(int i=2;i<=n;i++)
{
c(i);
h(100);
}
p(0);
return 0;
}
如有错误,欢迎大家评论区指出!感谢!