由题目可知,题目给出一个整数 n(n ≤ 50),求 。
由于给出 n 的数据范围过大,而 C++ 存储量有限,用 unsigned long long 也存不下稍微大一点的 n,所以需要用到高精度乘法和高精度加法结合来实现。
上代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// 高精度加法模板(本人喜欢用 vector)
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> c;
int t = 0;
for (int i = 0; i < A.size() || i < B.size(); i++)
{
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
c.push_back(t % 10);
t /= 10;
}
if (t) c.push_back(1);
return c;
}
// 高精度乘法模板
vector<int> mul(vector <int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i++)
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
int n;
vector<int> ans; // 定义一个 ans 的 vector 数组,用来存最终答案
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
vector<int> mult = {1}; // mult 需要初始化为 1(任何数乘0等于0)
for (int j = 2; j <= i; j++) // 从2开始阶乘(从1开始没有问题)
mult = mul(mult, j); // 引用高精度乘法函数
ans = add(ans, mult); // 将上面的结果加入 ans 数组里
}
// 从后往前依次输出答案
for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i];
puts("");
return 0;
}
完结(不喜勿喷)。