题目链接:https://www.luogu.com.cn/problem/P1009
题目描述
用高精度计算出 S = 1! + 2! + 3! + …+ n!(n≤50)。
其中“!”表示阶乘,例如:5!=5×4×3×2×1。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
测试样例
输入
3
输出
9
解题思路
1.要注意高精度,可能会想到用__int128,但是当你算到45的阶乘是就会发现这个也不够用了,而且算的很慢,不如自己手写一个高精度,我在这里用的是一个一位数组。
2.要注意输出,可能最后结果在数组里有很多空间,也就是数组的前面几位可能都是0,那么这些0是不需要输出的,我们只要从第一个不为0的数开始输出就行了。
AC代码
#include<bits/stdc++.h>
using namespace std;
int a[101],b[101];
//每一个数的阶乘
void mul(int n)
{
int q = 0;
for(int i=100;i>=0;i--)
{
b[i] = b[i] * n + q;
q = b[i] / 10;
b[i] = b[i] % 10;
}
}
//阶乘完之后的加法
void add()
{
int q = 0;
for(int i=100;i>=0;i--)
{
a[i] = a[i] + b[i] + q;
q = a[i] / 10;
a[i] = a[i] % 10;
}
}
int main()
{
int n;
cin>>n;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[100] = 1;
b[100] = 1;
//开始计算
for(int i=2;i<=n;i++)
{
mul(i);
add();
}
//找到第一个不为0的数,从这里开始输出
int j = 0;
for(int i=0;i<=100;i++)
{
if(a[i]!=0)
{
j = i;
break;
}
}
for(int m=j;m<=100;m++)
{
cout<<a[m];
}
return 0;
}