给定两个二进制字符串,返回他们的和(用二进制表示) 样例 a = 11 b = 1 返回 100 非常惭愧还不是自己想来的算法,注意到几点: 1.数字字符减去‘0’可以得到其对应的int值。 2.可以先都加上(无非加上得到0,1,2)然后逐位进行进位处理. 下面的程序就是这样的一种思路,这里发现一个自己没注意的点,导致一些数据通过不了,如果是三种或三种以上互斥的情况,要用if-else语句的话中间都要用else if,因为else值匹配离其最近的if。比如
if (case 1)
{---- ; }
if(case 2)
{------;}
else
{------;}
//这里的else就可能包含了case1的情况,如果在if里面返回函数值可能还觉察不到这个问题,但是如果知识一般的判断和处理数据,这个问题就很严重。
code:
string addBinary(string &a, string &b) {
int size_a=a.size();
int size_b=b.size();
if(size_a<=0||size_b<=0)
{
return string();
}
resortString(a); //重排字符串使得低位在前
resortString(b);
string res; //存放结果
int i=0;
int carry=0; //进位标志
for(i=0;i<size_a&&i<size_b;i++) //把相同的位先加上
{
res+='0'+(a[i]-'0')+(b[i]-'0'); //前面的那个‘0’保证加完还是字符
}
for(;i<a.size();i++)
{
res+=a[i];
}
for(;i<b.size();i++)
{
res+=b[i];
}
//到这里就都加上了,加完以后每一位上可能是0,1,2.
//下面要处理进位了,
for(i=0;i<res.size();i++)
{
int temp=res[i]-'0'+carry;
//这里是不同的情况,进位之后可能是2,或者3,也可能是1,0
if(temp==2) //进位之后本位是0了
{
carry=1;
res[i]='0';
}
else if(temp==3) //进位之后本位是1,这个else特别重要,如果是这种好几种情况的话一定要每次都加上else
{
carry=1;
res[i]='1';
}
else{
carry=0;
res[i]=temp+'0'; //不进位,两种情况,tem=1或者0,直接赋值就可以
}
}
if(carry==1) //如果最后一位还有进位,那么再加上一个1
{
res+='1';
}
resortString(res);
return res;
// write your code here
}
void resortString(string &a) //重排字符串
{
for(int i=0;i<a.size()/2;i++)
{
swap(a[i],a[a.size()-1-i]);
}
}