做题笔记-LeetCode415字符串相加

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

注意:

  1. num1 和num2 的长度都小于 5100.
  2. num1 和num2 都只包含数字 0-9.
  3. num1 和num2 都不包含任何前导零。

你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

一开始想到的是竖式相加法,从字符串的最后一个开始,建立一个结果字符串,把算得的每一位加入结果,进位保存,当有一个字符串处理完处理另一个剩余的,不过由于细节处理不到位,迭代器不兼容,不知道有没有大佬能看到这篇博客指出问题

class Solution {
public:
	int tr(char s)
	{
		return s - '0';
	}
	char dtr(int s)
	{
		return (s + '0');
	}
	string addStrings(string num1, string num2) {
		string res;
		string longer = num1.size() >= num2.size() ? num1 : num2;
		string shorter = num1.size() >= num2.size() ? num2 : num1;
		int j = longer.size() - 1;
		int carry = 0;
		auto it = res.begin();
		for (int i = shorter.size() - 1; i >= 0; i--)
		{
			int sum = tr(longer[j]) + tr(shorter[i]) + carry;
			carry = sum / 10;
			sum = sum % 10;
			res.insert(it, dtr(sum));
			j--;
		}
		if (j == 0 && carry != 0)res.insert(it, dtr(carry));
		if (j != 0)
		{
			if (carry != 0)
			{
				while (j >= 0)
				{
					int sum = tr(longer[j]) + carry;
					carry = sum / 10;
					sum %= 10;
					res.insert(it, dtr(sum));
					j--;
				}
			}
			else
			{
				while (j >= 0)
				{
					res.insert(it, dtr(longer[j]));
					j--;
				}
			}
		}
		return res;
	}
};

我感觉我逻辑上并没有问题,反正迭代器就是出现不兼容的问题。。

然后看了看评论大佬的方法,很简洁,值得学习,就仿照着写了

class Solution {
public:
    
    string addStrings(string num1, string num2) {
        string res;
        int carry=0,i=num1.size()-1,j=num2.size()-1;
        while(i>=0||j>=0||carry!=0)
        {
            if(i>=0){carry+=num1[i]-'0';i--;}
            if(j>=0){carry+=num2[j]-'0';j--;}
            int add=carry%10;
            res.insert(res.begin(),char(add+'0'));
            carry/=10;
        }
        return res;
    }
};

这种大数用字符串,数组,链表存储的数相加都可以这样解决。

上一篇:(牛客2018校招真题03)大整数相乘(拼多多)


下一篇:链表相加