Add Binary
要求
**Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.**
标签:数学,字符串
我的理解:
模拟二进制的加法
我的提交:
char *addBinary(char *a, char *b) {
int aptr = strlen(a)-1;
int bptr = strlen(b)-1;
int len = aptr >= bptr ? (aptr + 1):(bptr+1);
int resultptr = aptr>=bptr ? aptr:bptr;
char *result = aptr>=bptr ? a:b;
int carry=0,temp;
while(aptr>=0 && bptr>=0)
{
temp = a[aptr--] -'0' + b[bptr--]-'0' + carry;
result[resultptr--] = (temp & 1) + '0';//清除高位,如3,二进制数字11,我只需要01计算得数
carry = temp >>1;//右移1位 <=> 除以2
}
while(resultptr>=0)
{
temp = result[resultptr] - '0' + carry;
result[resultptr--] = (temp & 1) +'0';
carry = temp >> 1;
}
if(carry >0)
{
char *ultimateResult = (char *)malloc((len+1) * sizeof(char));
ultimateResult[0] = '1';
ultimateResult[1] = '\0';
result = strcat(ultimateResult,result);
}
return result;
}
注意事项:
- 使用两个int,aptr,bptr分别作 *a,*b的下标,并从后往前游,右端为二进制数的低位
- 使用一个int,ptr做结果*result的游标
- 使用一个int* result作结果,实质是指向*a,*b长度较长者,也方便多出位的运算
- 使用carry作进位,初始为0
- 1st 循环(条件:aptr>=0 && bptr>=0,即*a,*b都有位可相加)
- 使用temp记录相加结果(原因同Plus One);又因为原数组中的数据为字符,所以运算与存放结果时应相应-‘0’与+’0’
- 因运算为二进制:carry=temp/2;得数=temp%2(+’0’)
- 2cd 循环
- 原因:*a与*b中共同位相加完成后,长度较长者仍需运算
- 条件:ptr>=0
- ptr因此也是aptr或bptr
- 检验最高位是否有进位(carry>0?)
- 若有,则需在result的最高位处插入1
P.S:此解法可能由于参考了其他解法而导致有相似之处,感谢他们的分享!也欢迎各位学友都对我的解法的不足之处作出建议!