字符串相加

8640eb2b95db42e9bfda887dbeb51a61.png

 字符串相加

题目

415. 字符串相加 - 力扣(LeetCode)

思路

难点:

  1. 这里还是有点难度的,你需要模拟实现字符串的加法逻辑的实现
  2. 这里是不能直接把字符转化为整数进行计算,当数值比较小的时候是可以运算成功的,但是当数值比较大的时候,会产生溢出的情况。力扣测试的时候会拿32位的进行测试
    比如这样:99999999999999999999999999999999999999999999999999999999999999999999
    +9999999999999999999999999999999999999999999999999999999999999999999

解决办法:大数运算

  1. 大数运算模拟实现加法:开辟一个string类用来存放相加后的数值,然后循环遍历单独拿出来进行相加,尾插到开辟的string类里面,但是此时是反过来的,所以我们只需要反转string类里面的字符串,此时完成字符串的相加
  2. 大数运算模拟实现字符的相加是可以不用开辟数组空间就可以实现的,因为相乘是需要知道既定位置从而进行相加和进位,但是字符串的相加只需要从低位到高位相加进位就可以了。

图解:

代码

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;
    }
};

代码解释:

  1. 此代码实现了大数字的加法,因为当数字很大时,可能超出 int 或 long long 等内置类型的范围,使用字符串表示数字可以避免溢出。
  2. 从两个字符串的末尾开始逐位相加,同时处理进位,将结果存储在 str 中,最后将结果反转得到最终结果。
  3. 例如,对于 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"
  4. 模拟手动加法运算,从低位到高位逐位相加并处理进位,适用于任意长度的数字相加。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值