[NOIP1998 普及组] 阶乘之和
题目描述
用高精度计算出
S
=
1
!
+
2
!
+
3
!
+
⋯
+
n
!
(
n
≤
50
)
S = 1! + 2! + 3! + \cdots + n!(n \le 50)
S=1!+2!+3!+⋯+n!(n≤50)
其中“!”表示阶乘,例如: 5 ! = 5 × 4 × 3 × 2 × 1 5! = 5 \times 4 \times 3 \times 2 \times 1 5!=5×4×3×2×1
输入格式
一个正整数 n。
输出格式
一个正整数S,表示计算结果。
输入输出样例
输入 #1复制
3
输出 #1复制
9
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤50。
高精度加法和乘法的题目
详细高精度计算算法可以参考博主的另一篇博文
高精度大数的加减乘除算法解析
AC代码(C++)
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>& a, vector<int>& b)
{
vector<int> c;
int temp = 0; //存储进位
//a,b里只要有字符那么就得计数
for (int i = 0; i < a.size() || i < b.size() || temp; i++)
{
if (i < a.size())
temp += a[i];
if (i < b.size())
temp += b[i];
//必须取余,例如9+8 = 17,个位放17%10=7
c.push_back(temp % 10);
//考虑进位 17/10 = 1
temp /= 10;
}
//上面的例子9+8后循环直接结束如果temp非零得加入所有循环在temp非零时还得走
return c;
}
int main()
{
vector<int> a, b, c;
//初始化
//a是7145,b是129
a.push_back(5);
a.push_back(4);
a.push_back(1);
a.push_back(7);
b.push_back(9);
b.push_back(2);
b.push_back(1);
c = add(a, b);
//因为数字高位在容器的低位所以逆序输出
for (auto it = c.rbegin(); it != c.rend(); it++)
cout << *it;
return 0;
}