題目:給定兩個二進制字符串,返回他們的和(用二進制表示)。輸入為非空字符串且只包含數字 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可以用一個變量來代替,該變量代表進行幾進制的加法