大佬!!求解这个代码注释中的问题

P1009 [NOIP1998 普及组] 阶乘之和

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++所有函数的结尾加上;
}

|