给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
这个注意的就是从右往左计算,和1,2,445题比较类似。
解法1:
#include<iostream>
#include<sstream>
using namespace std;
class Solution{
public:
string addBinary(string a,string b){
string result="";
int c=0;
int i=a.size()-1;
int j=b.size()-1;
while(i>=0||j>=0||c==1){
//string是类,不能相减,但是字符可以,例如:‘8’就是8的ascll的值,它是字符常量
//string只有转换为每个元素的char的时候才可以相减
//加这个判断是因为如果相加的a和b第一个元素都是1则要进位,c=1,while继续执行,c+的只能是它本身即:1,判断的话加的c+=0.
c+=i>=0 ? a[i--]-'0':0;
c+=j>=0 ? b[j--]-'0':0;
result=char(c%2+'0')+result;
c/=2;
}
return result;
}
};
int main(){
int n,m;
string a="1010";
string b="1011";
Solution solution;
cout<<solution.addBinary(a,b)<<endl;
//int aaa=0;
//char aa='1';
1的ascll码就是49,直接输出的话
//aaa+=aa-'0';
//cout<<aaa<<endl;
减0算的是ascll的值
//aaa+=aa-'0';
//cout<<aaa<<endl;
system("pause");
}
解法2:最后也要处理最左边进1的的情况
#include<iostream>
#include<sstream>
#include<string.h>
#include<CString>
using namespace std;
class Solution{
public :
string addBinary(string a,string b){
int result=0;
if(a.size()<b.size())
swap(a,b);
int is_val=0;
for(int i=b.size();i<a.size();i++)
//补齐对位
b='0'+b;
//位数相同的部分
for(int i=b.size()-1;i>=0;i--){
result=a[i]-'0'+b[i]-'0'+is_val;
a[i]=result%2+'0';
is_val=result/2;
}
//a多余的部分如果进位
if(is_val==1){
a='1'+a;
}
return a;
}
};
int main(){
string a="1010";
string b="1011";
Solution solution;
string c="12";
c='1'+c;
cout<<c;
system("pause");
}