字符串相加, 大数加法

题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何内建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

来源:力扣
链接:字符串相加

思路:

  1. 首先根据字符串 num1 和 num2的长度进行补位, 在长度较短的字符串前插字符’0’直至长度相等, 这一步操作可以方便我们利用for循环从字符串末尾逐位向前相加
  2. 设置进位 step 初始值为 0, 用 string ret接收每一次结果, 第一步已经通过补齐操作使得num1, num2长度相等, 因此给利用 resize 给 ret 开好空间 ret.resize(num1.size());
    即 ret[i] = (num1[i] - ‘0’) + (num2[i] - ‘0’) + step + '0;
    若该字符 大于 '9’表示下次相加需要进位, 修改 step 为 1
    注意如果不大于字符 ‘9’, 要将step 置为 0(防止之前因为进位将step修改为1, 因此如果不置0, 本来本次相加不需要加1, 但由于上次修改了step为1导致本次相加多加了1)
  3. 最后要注意, 当 ret[0] = (num1[0] - ‘0’) + (num2[0] - ‘0’) + step + '0 的结果大于字符 '9’时, 说明此时需要进位, 但for循环记录本次 ret[0]的结果, 将step置为1之后结束循环, 此时返回 ret就丢失了这个记为值, 因此 for循环结束 再加一次判断
    即如果 step == 1的, 给 ret前插字符 ‘1’

代码示例:

class Solution {
public:
	string addStrings(string num1, string num2) {
		//根据num1和num2的长度进行补位操作
		int len1 = num1.size();
		int len2 = num2.size();
		int count = abs(len1 - len2);

		if (len1 > len2)
			num2.insert(0, count, '0');
		else if (len1 < len2)
			num1.insert(0, count, '0');

		int len = num1.size();
		string ret;//作返回值
		ret.resize(len);//开好空间,方便下标访问对应值
		int step = 0;//表示进位
		for (int i = len - 1; i >= 0; --i)
		{
			ret[i] = (num1[i] - '0') + (num2[i] - '0') + step + '0';

			if (ret[i] > '9')//大于字符'9', 即需要进位
			{
				ret[i] -= 10;
				step = 1;
			}
			else
				step = 0;
		}
		if (step == 1)
			ret.insert(0, 1, '1');
		return ret;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章