显然是在长双精度浮点型数(long double)可支持运算的范围内的;然而输出结果仅能以科学计数法的形式表现出来。因此,思考人类进行加法运算的方法。

显然,对于较复杂的加法运算,竖式是最有效的方法之一;而竖式中显然是将每个加数按位对齐后逐位运算并判断进位(如下方图所示),因此考核内容看似是大数的数学加法,实际是字符串的对齐与遍历。

考虑构建的数组长度。题中称至多会有行总位数至多为的加数参与运算,因此运算结果的位数至多为;根据此可以知道数组长度为时一定足以容纳所有可能的运算结果。

#include <bits/stdc++.h>
#define _CRT_SECURE_NO_DEPRECATE

int main() {
    std::string veryLongIntegerToAdd;
    std::vector<int> sum(103);
    for (int i = 0; i <= 102; i++) {
        sum[i] = 0;
    }
    int digitOverflowStorage = 0; // 进位指示器
    while (std::cin >> veryLongIntegerToAdd) {
        std::vector<int> digitsOfIntegerToAdd(103);
        if (veryLongIntegerToAdd == "0") // 读取终止标志
            break;
        else {
            for (int i = 0; i < 102; i++) {
                digitsOfIntegerToAdd[i] = 0;
            }
            for (int i = 102; i >= 0; i--) {
                // 逐次攫取字符串末尾一位,加入对齐字符串
                if (veryLongIntegerToAdd.empty())
                    break;
                digitsOfIntegerToAdd[i] = veryLongIntegerToAdd.at(veryLongIntegerToAdd.size() -
                                          1) - '0'; // 字符转整型数
                veryLongIntegerToAdd.pop_back();
            }
            for (int i = 102; i >= 0; i--) {
                // 列竖式
                int tmpDigitCalculationResult = sum[i] + digitOverflowStorage +
                                                digitsOfIntegerToAdd[i];
                sum[i] = tmpDigitCalculationResult % 10;
                digitOverflowStorage = tmpDigitCalculationResult / 10;
            }
        }
    }
    int invalidDigitFlag = 1;
    for (int i = 0; i < 103; i++) {
        // 废除运算结果中多余的0
        if (sum[i]) invalidDigitFlag = 0;
        if (invalidDigitFlag && !sum[i]) continue;
        std::cout << sum[i];
    }
}