1 条题解

  • 0
    @ 2025-4-28 8:51:07

    题意分析

    题目要求计算多个超长整数(长度不超过100100位)的总和。由于普通数据类型无法存储这么大的数字,需要使用高精度计算方法来逐位相加。

    • 输入
      • 最多100100行,每行一个非负整数(长度100\leq 100位)。
      • 最后一行以00表示输入结束。
    • 输出
      • 所有输入整数的和(可能超过100100位)。

    解题思路

    1. 高精度加法
      • 将每个数字的每一位存储在字符数组中。
      • 最低位开始逐位相加,并处理进位。
    2. 存储结果
      • 使用字符数组result存储最终的和,初始化为全00
      • 每次读取一个数后,将其与result逐位相加。
    3. 输出处理
      • 从最高位开始输出,忽略前导00

    实现步骤

    1. 初始化
      • result数组初始化为10510500(预留足够空间)。
    2. 逐行读取输入
      • 对每个数字,从最低位开始与result对应位相加。
      • 处理进位,并更新result
    3. 输出结果
      • result的最高位开始扫描,找到第一个非00位。
      • 从该位开始反向输出所有数字。

    C++实现

    #include <cstdio>
    #include <cstring>
    
    char str[105];      // 存储当前输入的数字
    char result[105];   // 存储累加结果
    
    int main() {
        // 初始化result为全0
        for (int i = 0; i < 105; ++i)
            result[i] = '0';
    
        while (scanf("%s", str) != EOF) {
            if (str[0] == '0' && str[1] == '\0') break; // 遇到0结束输入
    
            int len = strlen(str);
            int carry = 0;  // 进位
            int pos = 0;    // 当前处理的位置
    
            // 从最低位开始逐位相加
            for (int i = len - 1; i >= 0; --i) {
                int temp = (str[i] - '0') + (result[pos] - '0') + carry;
                result[pos++] = (temp % 10) + '0';  // 更新当前位
                carry = temp / 10;                 // 计算进位
            }
    
            // 处理剩余的进位
            while (carry != 0) {
                int temp = (result[pos] - '0') + carry;
                result[pos++] = (temp % 10) + '0';
                carry = temp / 10;
            }
        }
    
        // 找到最高有效位
        int pos = 104;
        while (pos >= 0 && result[pos] == '0')
            pos--;
    
        // 如果全0,输出0
        if (pos == -1) {
            printf("0\n");
        } else {
            // 反向输出结果
            for (int i = pos; i >= 0; --i)
                printf("%c", result[i]);
            printf("\n");
        }
    
        return 0;
    }
    

    代码说明

    • 输入处理
      • 使用str数组存储当前输入的数字。
      • 遇到单独00时终止输入。
    • 高精度加法
      • 从数字的最低位(str[len-1])开始逐位相加。
      • 进位carry初始为00,每次相加后更新。
    • 结果输出
      • result数组的最高位(104104)开始扫描,跳过前导00
      • 反向输出有效数字位。

    时间复杂度O(n×m)O(n \times m),其中nn是数字个数,mm是数字的平均位数。

    • 1

    信息

    ID
    504
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者