leetcode-67- Add Binary
题目描述:
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
要完成的函数:
string addBinary(string a, string b)
说明:
1、本题实现二进制的加法,无论有多少位二进制均可以处理。不采用常规的二进制转十进制,十进制相加,结果再转回二进制的做法,是因为这样子很麻烦,而且对于超过int表示范围的数,这种常规做法无法解决问题。可能有的朋友会说设置long类型的变量来存储和运算,但是c++只支持小于等于INT_MAX的数的计算,大于INT_MAX的数没有办法相加和相乘的。因此我们才需要设计大数相加的算法和大数相乘的算法。笔者之后应该会涉及到这个问题,之后再来记录,分享给大家。
所以这道题实现二进制相加是最好的做法。
2、两个二进制相加,笔者采用的是这样的方法,比如“1111”+“110”:
两个数先翻转,变成“1111”和“011”;
接着把两个数中短的那个,补0在最后,补足长度到两个数一样长,变成“1111”和“0110”;
接着从第一位开始,逐位相加,情况处理,像传统的人工加法一样处理,得到“10101”;
最后翻转回去,得到最终的结果“10101”。
3、这道题目不翻转字符串,也可以处理,只不过补零补在前面,然后从最后面一位开始计算,开始处理,到最前面结束。应该会比笔者下述代码更快。
代码:
#include<string>
string reverse(string a)//实现对于字符串的翻转
{
int i=0;
int j=a.size()-1;
char temp;
while(i<j)
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
j--;
i++;
}
return a;
}
string addBinary(string a, string b)//主体函数
{
string result="";//存放结果
a=reverse(a);
b=reverse(b);//翻转两个字符串便于处理
int lena=a.size();
int lenb=b.size();
if(lena>lenb)//补零
{
for(int i=lenb;i<lena;i++)
{
b=b+"0";
}
}
else
{
for(int i=lena;i<lenb;i++)
{
a=a+"0";
}
}
int len=lena>lenb?lena:lenb;
bool addflag=0;//进位标志
for(int i=0;i<len;i++)
{
if(a[i]-48+b[i]-48+addflag==0)//各种情况的处理
{
result+="0";
addflag=0;
}
else if(a[i]-48+b[i]-48+addflag==1)
{
result+="1";
addflag=0;
}
else if(a[i]-48+b[i]-48+addflag==2)
{
result+="0";
addflag=1;
}
else if(a[i]-48+b[i]-48+addflag==3)
{
result+="1";
addflag=1;
}
}
if(addflag==1)//最后的进位
result+="1";
return reverse(result);
}