给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
解题思路:
首先要有对齐的思想,较短的数用0补齐,遍历的时候将两个位和进位标志三个“数”(代码里是字符)相加,总共会出现四种情况:000,001,011,111,分别对应的结果是:(本位 进位) 0 0, 1 0, 0 1, 1 1。循环遍历结束后,若进位标志仍为'1',则说明出现了新的最高位,值为1。最后,将倒序的字符数组翻转,末尾加'\0'即可。
char * addBinary(char * a, char * b){
//二进制应对齐,不足位用0补齐
int alen = strlen(a), blen = strlen(b);
int longer = alen > blen ? alen : blen;
char *r = (char*)malloc(longer+2);//多申请两位,因为包含进位和\0
char add = '0'; //进位标志
int i = alen-1, j = blen-1, k = 0;
while(longer--){
int na, nb; //要相加的两位
if(i>=0) na = a[i];
else na = '0';//对齐的0
if(j>=0) nb = b[j];
else nb = '0';//对齐的0
//四种情况
if(na+nb+add == '0'+'0'+'0'){
r[k++] = '0';
add = '0';
}else if(na+nb+add == '1'+'0'+'0'){
r[k++] = '1';
add = '0';
}else if(na+nb+add == '1'+'1'+'0'){
r[k++] = '0';
add = '1';
}else if(na+nb+add == '1'+'1'+'1'){
r[k++] = '1';//本位
add = '1';//进位
}
i--;j--;
}
if(add == '1') r[k++] = '1';//还有一位,新的最高位
//翻转
for(i=0;i<k/2;i++){
char temp = r[i];
r[i] = r[k-i-1];
r[k-i-1] = temp;
}
r[k] = '\0';
return r;
}