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可以用一個變量來代替,該變量代表進行幾進制的加法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM