1 条题解

  • 0
    @ 2025-2-11 18:07:47

    方法1:

    #include <bits/stdc++.h>
    using namespace std;
    
    // 函数用于高精度加法,接受两个大整数(以vector形式表示)a和b,返回它们的和
    vector<int> add(vector<int> a, vector<int> b) {
        vector<int> c;  // 用于存储加法结果
        int cr = 0, i = 0;  // cr表示进位,i是索引
        // 直到所有位加完,并且没有进位
        while (i < a.size() || i < b.size() || cr) {
            int s = cr;  // 将进位赋给当前和
            if (i < a.size()) s += a[i];  // 如果a中有当前位,累加到s
            if (i < b.size()) s += b[i];  // 如果b中有当前位,累加到s
            c.push_back(s % 10);  // 当前位结果是s的个位
            cr = s / 10;  // 更新进位,s除以10的商
            i++;  // 处理下一个位
        }
        return c;  // 返回加法结果
    }
    
    // 函数用于高精度乘法,接受一个大整数a(以vector形式表示)和一个整数k,返回a乘k的结果
    vector<int> mul(vector<int> a, int k) {
        vector<int> c;  // 存储乘法结果
        int cr = 0;  // 进位
        for (int i = 0; i < a.size(); ++i) {
            int t = a[i] * k + cr;  // 计算当前位的乘积,加上进位
            c.push_back(t % 10);  // 当前位结果是t的个位
            cr = t / 10;  // 更新进位,t除以10的商
        }
        // 如果进位不为0,继续处理进位
        while (cr) {
            c.push_back(cr % 10);  // 当前进位的个位
            cr /= 10;  // 更新进位
        }
        return c;  // 返回乘法结果
    }
    
    int main() {
        int n;
        cin >> n;  // 输入n,表示计算1! + 2! + 3! + ... + n!
    
        vector<int> sum, fc(1, 1);  // sum用于存储阶乘和,fc用于存储当前的阶乘(初始化为1)
    
        // 计算1! + 2! + 3! + ... + n!,初始sum为0
        sum = add(sum, fc);  // 先将1!加到sum中
        for (int k = 2; k <= n; ++k) {
            fc = mul(fc, k);  // 计算当前阶乘k!
            sum = add(sum, fc);  // 将当前阶乘加到sum中
        }
    
        // 输出最终结果,注意是从高位到低位输出
        for (int i = sum.size() - 1; i >= 0; --i)
            cout << sum[i];  // 输出每一位
        cout << endl;  // 输出换行符
    
        return 0;  // 程序结束
    }
    
    
    • 1

    信息

    ID
    653
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    4
    上传者