一、题目描述
力扣链接:力扣415.字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
二、思路解析
这里题目不允许使用字符串转整数的函数,那么还有一个方法,那就是对字符串的每一个字符都减去'0'
,就可以得到对应的数字。
在很多编程语言中,字符和数字之间存在ASCII码
(或Unicode码)的关系。ASCII码是一种将字符映射到数字的编码方式。在ASCII码中,数字字符'0'
到'9'
的编码是连续的,依次为48
到 57
。因此,当你从字符 ‘0’ 中减去 ‘0’ 时,实际上是将字符的ASCII码值减去 ‘0’ 的ASCII码值,得到的结果就是字符所表示的数字。
举例来说:
- ‘0’ 的ASCII码是 48,所以 ‘0’ - ‘0’ 就是 48 - 48,结果是 0。
- ‘1’ 的ASCII码是 49,所以 ‘1’ - ‘0’ 就是 49 - 48,结果是 1。
- ‘2’ 的ASCII码是 50,所以 ‘2’ - ‘0’ 就是 50 - 48,结果是 2。
- 以此类推,直到 ‘9’ 的ASCII码是 57,所以 ‘9’ - ‘0’ 就是 57 - 48,结果是 9。
三、C++题解
根据以上结论,不难写出代码:
class Solution {
public:
string addStrings(string num1, string num2) {
int m = num1.size(), n = num2.size();
int i = m - 1, j = n - 1, carry = 0; // carry代表进位
string result;
while (i >= 0 || j >= 0 || carry != 0) {
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
int sum = x + y + carry;
carry = sum / 10;
result.push_back('0' + sum % 10);
--i;
--j;
}
// 因为是倒着push_back的,所以要反过来
reverse(result.begin(), result.end());
return result;
}
};