hzj_0319 @ 2024-12-31 21:35:21
//题目描述
//用高精度计算出
//S=1!+2!+3!+...+n!(n≤50n≤50)。
//其中 ! 表示阶乘,定义为
//n!=n×(n-1)×(n-2)×...×1。例如,5!=5×4×3×2×1=120。
//输入格式
//一个正整数 n
//输出格式
//一个正整数 S,表示计算结果。
//输入输出样例
//输入
//3
//输出
//9
//说明/提示
//【数据范围】
//对于 100% 的数据,1≤n≤50
#include <bits/stdc++.h>//万能头文件
using namespace std; //标准空间:使用同名函数
string high_precision_multiplication(const char *a_1,const char *b_1){
vector<int> a;
vector<int> b;
vector<int> c;
int lena = strlen(a_1),lenb = strlen(b_1);
for (int i = 0;i < lena;i++){
a.push_back(a_1[lena - i - 1] - '0');
}
for (int i = 0;i < lenb;i++){
b.push_back(b_1[lenb - i - 1] - '0');
}
for (int i = 0;i < lena;i++){
int t1 = 0;
for (int j = 0;j < lenb;j++){
int index = i + j;
if (index >= c.size()) {
c.push_back(0);
}
int temp = c[index] + a[i] * b[j];
t1 = temp / 10;
int t0 = temp % 10;
c[index] = t0;
//--------------------------------------
if (index + 1 < c.size()){
c[index + 1] += t1;//为什么这里要+=t1,不能=t1吗??
}else{
c.push_back(t1);
}
//------------------------------------------
}
}
//下面这一行这样写结果对的,但lenc = c.size() - 1;循环条件c[lenc] == 0 && lenc > 0却少了一位有效数字,这是为什么??
//-------------------------------------------
int lenc = c.size();
while (lenc - 1 > 0 && c[lenc - 1] == 0){
lenc--;
}
//----------------------------------------------
// //输出
// for (int i = lenc;i >= 0;i--){
// cout << c[i];
// }
// cout << endl;
// 将结果存入静态字符数组并返回
static char result[105];
for (int i = 0; i < lenc; i++) {
result[lenc - i - 1] = c[i] + '0'; // 将数字转换为字符
}
result[lenc] = '\0'; // 添加字符串结束符
return result;
}
string high_precision_addition(const char *a_1,const char *b_1){
vector<int> a;
vector<int> b;
vector<int> c;
int lena = strlen(a_1),lenb = strlen(b_1);
for (int i = 0;i < lena;i++){
a.push_back(a_1[lena - i - 1] - '0');
}
for (int i = 0;i < lenb;i++){
b.push_back(b_1[lenb - i - 1] - '0');
}
int lenc = max(lena,lenb);
int temp = 0,t1 = 0,t0 = 0;
for (int i = 0;i < lenc;i++){
if (i >= a.size()){
a.push_back(0);
}
if (i >= b.size()){
b.push_back(0);
}
if (i >= c.size()){
c.push_back(0);
}
temp = a[i] + b[i] + c[i];
t1 = temp / 10;
t0 = temp % 10;
c[i] = t0;
if (i + 1 < c.size()){
c[i + 1] = t1;
}else{
c.push_back(t1);
}
}
//注释下面---之间的代码---后结果对的,但没注释却少了一位有效数字,这是为什么??
//---------------------------
// if (c[lenc] == 0){
// lenc--;
// }
//------------------------
if (c[lenc] != 0){
lenc++;
}
// //输出
// for (int i = lenc;i >= 0;i--){
// cout << c[i];
// }
// cout << endl;
// 将结果存入静态字符数组并返回
static char result[105];
for (int i = 0; i < lenc; i++) {
result[lenc - i - 1] = c[i] + '0'; // 将数字转换为字符
}
result[lenc] = '\0'; // 添加字符串结束符
return result;
}
int main(){ // 主函数入口
// char a1[50],b1[50];
// cin >> a1 >> b1;
// cout << high_precision_multiplication(a1,b1) << endl;
// cout << high_precision_addition(a1,b1);
int n;
cin >> n;
string temp = "1";
string sum = "0";
for (int i = 1;i <= n;i++){
string t = to_string(i);
// cout << temp << "*";
temp = high_precision_multiplication(temp.c_str(),t.c_str());
// cout << t << "=" << temp << endl;
// cout << sum << "+" << temp << "=";
sum = high_precision_addition(sum.c_str(),temp.c_str());
// cout << sum << endl;
}
cout << sum;
return 0; //C++所有函数的结尾加上;
}