给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
第一个思路是将二进制转换为整型,相加后在转换为二进制,但是对于字符串特别长的会出现错误!
class Solution {
public:
string addBinary(string a, string b) {
int sum_a = 0, sum_b = 0, sum = 0;
for (int i = 0; i < a.size(); i++)
{
sum_a += (a[a.size() - i - 1] - '0') * pow(2, i);
}
for (int i = 0; i < b.size(); i++)
{
sum_b += (b[b.size() - i - 1] - '0') * pow(2, i);
}
sum = sum_a + sum_b;
cout << sum_a<<'+'<<sum_b<<'='<<sum << endl;
string s;
int Max = max(b.size(), a.size()) + 1;
//s[2] = 'd';
for (int i = 0; i < Max; i++)
{
string add;
add = (sum / (pow(2, Max - i - 1)) + '0');
cout << add << ' ' << Max << endl;
sum = sum % int((pow(2, Max - i - 1)));
//cout << s[i] << ' '<<sum<< endl;
s.append(add);
}
if (s[0] == '0')
s.erase(0,1);
cout << s << endl;
return s;
}
};
将修改为正常的二进制加法后,通过
class Solution {
public:
string addBinary(string a, string b) {
string s;
int Max = max(b.size(), a.size());
int Min = min(b.size(), a.size());
//s[2] = 'd';
int ac = 0;
for (int i = 0; i < Min; i++)
{
char add;
add = a[a.size() - i - 1] - '0' + b[b.size() - i - 1] +ac;
cout << "add = "<<add << endl;
if (add >= '2')
{
ac = 1;
add -= 2;
s.append(&add,1);
}
else
{
ac = 0;
s.append(&add, 1);
}
cout << s << endl;
}
for (int i = Min; i < Max; i++)
{
char add;
if (b.size() > a.size())
add = b[b.size() - i - 1] + ac;
else
add = a[a.size() - i - 1]+ ac;
if (add >= '2')
{
ac = 1;
add -= 2;
s.append(&add, 1);
}
else
{
ac = 0;
s.append(&add, 1);
}
cout << s << endl;
}
if(ac)
s.append("1", 1);
string res;
for (int i = 0; i < s.size(); i++)
{
char save = s[s.size() - i -1];
res.append(&save, 1);
}
cout << res << endl;
return res;
}
};