64 lines
1.4 KiB
C++
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;
|
|
} |