显然是在长双精度浮点型数(
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];
}
}