字符串相加
题目
思路
难点:
- 这里还是有点难度的,你需要模拟实现字符串的加法逻辑的实现
- 这里是不能直接把字符转化为整数进行计算,当数值比较小的时候是可以运算成功的,但是当数值比较大的时候,会产生溢出的情况。力扣测试的时候会拿32位的进行测试
比如这样:99999999999999999999999999999999999999999999999999999999999999999999
+9999999999999999999999999999999999999999999999999999999999999999999解决办法:大数运算
- 大数运算模拟实现加法:开辟一个string类用来存放相加后的数值,然后循环遍历单独拿出来进行相加,尾插到开辟的string类里面,但是此时是反过来的,所以我们只需要反转string类里面的字符串,此时完成字符串的相加
- 大数运算模拟实现字符的相加是可以不用开辟数组空间就可以实现的,因为相乘是需要知道既定位置从而进行相加和进位,但是字符串的相加只需要从低位到高位相加进位就可以了。
图解:
代码
class Solution { public: string addStrings(string num1, string num2) { //首先创建一个用来存储string的数组空间 string str; //确定num1,num2的尾部,用来当作下标计算使用 int end1 = num1.size() -1; int end2 = num2.siez() -1; //循环相加,循环条件是end1 >= 0 || end2 >= 0,这里不能使用并且 //不使用并且的原因是要把两个string类厘米的字符都相加 int next = 0; while(end1 >= 0 || end2 >= 0) { //取出一个字符转化为整数,进行相加 //但是在此之前需要先判断是不是大于等于0,不是的话直接给0就可以 int x1 = end1 >= 0 ? num1[end1--] - '0' : 0; int x2 = end2 >= 0 ? num2[end2--] - '0' : 0; int sum = x1 + x2; next = val / 10; int val = sum % 10; //进行尾插,但是需要转化为字符 str += val - '0'; } if(next == 1) str += '1'; reverse(str.begin(),str.end()); return str; } };
代码解释:
- 此代码实现了大数字的加法,因为当数字很大时,可能超出
int
或long long
等内置类型的范围,使用字符串表示数字可以避免溢出。- 从两个字符串的末尾开始逐位相加,同时处理进位,将结果存储在
str
中,最后将结果反转得到最终结果。- 例如,对于
num1 = "123"
和num2 = "456"
:首先计算3 + 6 = 9
,没有进位,str
为"9"
。然后计算2 + 5 = 7
,没有进位,str
为"79"
。最后计算1 + 4 = 5
,没有进位,str
为"579"
。如果输入是"999"
和"1"
:首先计算9 + 1 = 10
,进位为 1,str
为"0"
。然后计算9 + 0 + 1 = 10
,进位为 1,str
为"00"
。最后计算9 + 0 + 1 = 10
,进位为 1,str
为"000"
。最后添加进位,str
为"0001"
,反转后得到"1000"
。- 模拟手动加法运算,从低位到高位逐位相加并处理进位,适用于任意长度的数字相加。