Files
python/TangDou/AcWing/HighPrecision/factorial_sum.cpp
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

64 lines
1.4 KiB
C++

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000;
int a[N], b[N];
int al, bl;
void add(int a[], int &al, int b[], int &bl) {
int t = 0;
al = max(al, bl);
for (int i = 0; i < al; i++) {
t += a[i] + b[i];
a[i] = t % 10;
t /= 10;
}
if (t) a[al++] = 1;
while (al > 1 && a[al-1] == 0) al--;
}
void mul(int a[], int &al, int b[], int &bl) {
int t = 0;
int c[N] = {0};
for (int i = 0; i < al; i++)
for (int j = 0; j < bl; j++)
c[i + j] += a[i] * b[j];
al += bl;
for (int i = 0; i < al; i++) {
t += c[i];
a[i] = t % 10;
t /= 10;
}
while (al > 1 && a[al-1] == 0) al--;
}
int main() {
int n;
cin >> n;
int sum[N] = {0}, sum_len = 1;
int fact[N] = {1}, fact_len = 1;
for (int i = 1; i <= n; i++) {
// 计算当前阶乘 i! = (i-1)! * i
int num = i;
int temp[N] = {0}, temp_len = 0;
while (num) {
temp[temp_len++] = num % 10;
num /= 10;
}
mul(fact, fact_len, temp, temp_len);
// 将阶乘结果加到总和中
add(sum, sum_len, fact, fact_len);
}
for (int i = sum_len - 1; i >= 0; i--) {
cout << sum[i];
}
cout << endl;
return 0;
}