67.二进制求和

题目链接:

方法一、

我们可以借鉴「列竖式」的方法,末尾对齐,逐位相加。在十进制的计算中「逢十进一」,二进制中我们需要「逢二进一」。

具体的,我们可以取 n = max ⁡ { ∣ a ∣ , ∣ b ∣ } n = \max\{ |a|, |b| \} n=max{a,b},循环 n n n次,从最低位开始遍历。我们使用一个变量 c a r r y \rm carry carry表示上一个位置的进位,初始值为 0 0 0。记当前位置对其的两个位为 a i a_i ai b i b_i bi,则每一位的答案为 ( c a r r y + a i + b i )   m o d   2 ({\rm carry} + a_i + b_i) \bmod{2} (carry+ai+bi)mod2,下一位的进位为 ⌊ c a r r y + a i + b i 2 ⌋ \lfloor \frac{{\rm carry} + a_i + b_i}{2} \rfloor 2carry+ai+bi。重复上述步骤,直到数字 a a a b b b的每一位计算完毕。最后如果 c a r r y \rm carry carry的最高位不为 000,则将最高位添加到计算结果的末尾。

注意,为了让各个位置对齐,你可以先反转这个代表二进制数字的字符串,然后低下标对应低位,高下标对应高位。当然你也可以直接把 a a a b b b 中短的那一个补 0 0 0 直到和长的那个一样长,然后从高位向低位遍历,对应位置的答案按照顺序存入答案字符串内,最终将答案串反转。这里的代码给出第一种的实现。

class Solution {
public:
    string addBinary(string a, string b) {
        string ans;
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());

        int n = max(a.size(), b.size()), carry = 0;
        for (int i = 0; i < n; ++i) {
            carry += i < a.size() ? (a.at(i) == '1') : 0;
            carry += i < b.size() ? (b.at(i) == '1') : 0;//这个地方值得学习
            ans.push_back((carry % 2) ? '1' : '0');
            carry /= 2;
        }

        if (carry) ans.push_back('1');
       
        reverse(ans.begin(), ans.end());
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值