Add Binary
Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.
题意:求两个二进制字符串相加,并把结果保存为二进制字符串。
解题思路:动态申请一个数组用于保存相加后的二进制字符串,两个二进制相加有两种可能:
1. 111+11 = 1010 ,相加后长度+1,最高位存在进位
2. 1+1000=1001, 相加后长度没有变化,按照正常的二进制相加,该进位就进位。
注意事项:注意进位,注意字符转整型需要-‘0’ 整型转字符需要+‘0’, 申请的数组长度要=最长的字符串+1(这个1表示可能最高位存在进位)+1(这个1表示长度需要包括空字符 ‘\0’)。
实现C代码如下:
/**
* 解题思路:另外申请一个数组用于保存相加后的二进制字符串,注意字转整型与整型转字符。注意二进制之间的进位。
*/
char *addBinary(char *a, char *b) {
int i,j, temp,temp1,lenA,lenB,len;
char *str;
lenA = strlen(a);
lenB = strlen(b);
len = lenA>lenB?lenA:lenB;
str= (char *)malloc((len+2)*sizeof(char));//申请的空间要大于最大的字符串长度加1+1,第一个1指字符串相加后可能进位,第二个1指字符串最后的'\0'结束字符
memset(str,0,(len+2)*sizeof(char));
j = len-1;temp = 0;
for(i=len;i >= 0 && lenA > 0 && lenB > 0; i--){
*(str+i) = ((*(a+lenA-1)-'0') + (*(b+lenB-1)-'0') + temp)%2 + '0';
temp = ((*(a+lenA-1)-'0') + (*(b+lenB-1)-'0') + temp)/2;
lenA--;lenB--;
}
if(lenA == 0){//则对b字符串进行赋值给str
for(; lenB > 0;i--){
*(str+i) = ((*(b+lenB-1)-'0') +temp)%2 + '0';
temp = ((*(b+lenB-1)-'0') +temp)/2;
lenB--;
}
}else if(lenB == 0){//对a字符串进行赋值给str
for(; lenA >0;i--){
*(str+i) = ((*(a+lenA-1)-'0') + temp)%2+'0';
temp = ((*(a+lenA-1)-'0') + temp)/2;
lenA--;
}
}
if(temp == 1) {*(str+i) = temp+'0';return str+i;}//若temp进位为1,则赋值给str
return str+i+1;
}