Add Binary
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
就是简化版的高精度加法,但是,其实也不是简化了。
因为有一个特殊情况:如果进位是1,那么剩下一个数的时候后面的为都是1,那么1+1要进位,就要一直进位进到最高位+1了。
如11110101,到第五位要进位的话,就会一直进位超过最高位了,而这个在10进制中是没有的情况。
class Solution {
public:
string addBinary(string a, string b) {
int up = 0;
int i = a.length()-1;
int j = b.length()-1;
string sum;
int s = 0;
for (; i >= 0 && j >= 0; i--, j--)
{
s = a[i]+b[j]+up-'0'-'0';
up = s/2;
sum.push_back(s%2+'0');
}
while (i>=0)
{
s = a[i] + up - '0';
up = s/2;
sum.push_back(s%2+'0');
i--;
}
while (j>=0)
{
s = b[j] + up - '0';
up = s/2;
sum.push_back(s%2+'0');
j--;
}
if (up > 0)
{
sum.push_back(up + '0');
}
reverse(sum.begin(), sum.end());
return sum;
}
};
string addBinary(string a, string b)
{
int na = a.length(), nb = b.length();
int n = max(na, nb);
string s(n+1, '0');//注意string和vector的初始化有所不一样的地方
bool carry = false;
for (na--,nb--; na>=0 || nb>=0; na--, nb--)
{
int a1 = na>=0? a[na]-'0':0;
int b1 = nb>=0? b[nb]-'0':0;
int sum = a1+b1+carry;
carry = sum/2;
sum %= 2;
s[n--] = sum + '0';
}
if (carry) s[n] = carry + '0';
//注意:是s[1],因为当结果为0的时候需要保留‘0’,记住erase的使用方法
while (s[1] && s[0] == '0') s.erase(s.begin());
return s;
}
//2014-2-8 update
string addBinary(string a, string b)
{
string c;
int carry = 0;
for (int i = a.length() - 1, j = b.length()-1; i >= 0 || j>=0 ; i--, j--)
{
int an = i>=0? a[i]-'0':0;
int bn = j>=0? b[j]-'0':0;
int sum = an + bn + carry;
carry = sum/2;
sum %= 2;
c.push_back(sum+'0');
}
if (carry) c.push_back(carry+'0');
reverse(c.begin(), c.end());
return c;
}