原题:
题目描述
用高精度计算出 𝑆=1!+2!+3!+⋯+𝑛!(𝑛≤50)。
其中
!
表示阶乘,定义为 𝑛!=𝑛×(𝑛−1)×(𝑛−2)×⋯×1。例如,5!=5×4×3×2×1=120。输入格式
一个正整数 𝑛。
输出格式
一个正整数 𝑆,表示计算结果。
输入输出样例
输入 #1复制
3输出 #1复制
9说明/提示
【数据范围】
对于 100%的数据,1≤𝑛≤50。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 𝑛≤20,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。
NOIP1998 普及组 第二题
一旦涉及到阶乘,难免会超出常规的数据类型存储量,需要使用高精度来维护数据,即利用数组模拟数据的运算。
这道题的基本思路为:
- 用数组分别表示阶乘结果和最终的阶乘和。
- 模拟乘法运算过程。(注意进位)
- 模拟加法运算过程。
- 按正常的数位顺序输出结果。
#include<iostream>
using namespace std;
int num[10000]={0},sum[10000]={0};
int len=0;//sum的最高位对应下标
int main()
{
num[0]=1;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int s=0;s<=len;s++)
num[s]*=i;
for(int s=0;s<len;s++)
{
if(num[s]>9)
{
int temp=num[s];
num[s]%=10;
num[s+1]+=temp/10;
}
}
for(int s=0;s<=len;s++)
{
sum[s]+=num[s];
if(sum[s]>9)
{
int temp=sum[s];
if(s==len)
{
sum[len++]=temp%10;
sum[len]=temp/10;
}
else
{
sum[s]%=10;
sum[s+1]+=temp/10;
}
}
}
}
for(int i=len;i>=0;i--)
cout<<sum[i];
}
也是调整了很多遍,中间细节问题出了不少。