67. 二进制求和c++(四种方法)

题目:给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。

示例 1:

输入: a = “11”, b = “1” 输出: “100”

示例 2:

输入: a = “1010”, b = “1011” 输出: “10101”

思路:

1、首先让两个字符串等长,若不等长,在短的字符串前补零

2、然后从后到前遍历所有的位数,同位相加,记得加上进位,二进制数相加结果与异或结果相同,所以用异或代替

3、判断相加后的值,若大于等于2,下一位需要进一

4、最后一次加法(异或)结束后,判断有没有进位。即 最高位的进位单独处理

class Solution {
public:
    string addBinary(string a, string b) {
        int a_len = a.size();
        int b_len = b.size();
        if(a_len < b_len){   //保证b字符串较短
            swap(a, b);
            swap(a_len, b_len);
        }
        if(a_len != b_len)   //如果a  b字符串长度不同,则把短的字符串用0补齐
            b.insert(0, a_len- b_len, '0');
        int carry = 0, cur = 0;
        string result;
        for(int i = a_len - 1; i >= 0; --i){
            int ia = a[i] - '0';
            int ib = b[i] - '0';
            cur = ia ^ ib ^ carry;  // 二进制数相加结果与异或结果相同
            if(ia + ib + carry >= 2) carry = 1;  //判断有无进位
            else carry = 0;
            result.insert(0, 1, cur + '0');  //用insert加在字符串最前面,也可以用 += 加在后面,最后用reserve函数反转
        }
        if(carry)  // 最高位的进位单独处理
            result.insert(0, 1, carry + '0');
        return result;
    }
};

下面这个是不用补0,用reverse()函数反转来实现的

class Solution {
public:
    string addBinary(string a, string b) {
        int a_size=a.size(),b_size=b.size();   
        if (a_size<b_size){    //保证b的长度为小的
            swap(a,b);
            swap(a_size,b_size);
        }
        reverse(a.begin(),a.end());  //反转,方便我从下标0开始计算。而不补0了
        reverse(b.begin(),b.end());
        string answer="";
        int carry=0,sum;
        for (int i=0;i<b_size;++i){    //处理两个字符串共同长的那部分字符
            sum=a[i]-'0'+b[i]-'0'+carry;
            answer=answer+char(sum%2+'0');
            carry=sum/2;     
        }
        for (int i=b_size;i<a_size;++i){  //处理长一点字符串多出来的那部分字符
            sum=carry+a[i]-'0';
            answer=answer+char(sum%2+'0');
            carry=sum/2;
        }
        if (carry==1)
            answer=answer+'1';
        reverse(answer.begin(),answer.end());
        return answer;
    }
};

--------------2019.12.31更新---------------

看到自己的函数库里面有字符串的加法函数,想到这也是一个字符串加法呀,不过是二进制的。只要把代码中十进制的部分改成二进制就好了。十进制的见下面链接

简单常用的一些函数,个人的函数库 : https://blog.csdn.net/qq_43657442/article/details/97796395

string addStrings(string num1, string num2) {
        string str;
        int cur = 0, i = num1.size()-1, j = num2.size()-1;
        //从字符串的末尾(我们数字的末位)开始加,直到加到最高位加完
        while (i >= 0 || j >= 0 || cur != 0) {    //判断是否加完,其实根据||的计算方式,cur!=0只会在把两个字符串的元素遍历完才会判断。一般来讲只有两个字符串相等且加了有进位的才会判断到这儿
            if (i >= 0) cur += num1[i--] - '0';   //判断字符串1是否所有元素加完
            if (j >= 0) cur += num2[j--] - '0';   //判断字符串2是否所有元素加完
            str += to_string (cur % 2);          //取低位变成字符加到字符串中
            cur /= 2;                            //判断有无进位
        }
        reverse(str.begin(), str.end());          //把字符串倒置
        return str;
    }

或者

string addStrings(string num1, string num2) {
        string str;
        int cur = 0, i = num1.size()-1, j = num2.size()-1;
        int maxLength=i>j?i:j;
        while (maxLength>=0 || cur != 0) {
            if (i >= 0) cur += num1[i--] - '0';
            if (j >= 0) cur += num2[j--] - '0';
            str += to_string (cur % 2);
            cur /= 2;
            maxLength--;
        }
        reverse(str.begin(), str.end());
        return str; 
    }

其实那些数字2、数字10可以用一个变量来代替,该变量代表进行几进制的加法

发布了78 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43657442/article/details/103710414