给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
不推荐思路:字符串->二进制->十进制->相加->二进制 ->字符串
C代码:字符->ASCII码->相加->进位分析->ASCII码 ->字符->字符串(C语言中的字符串相当于字符数组,故 *(a+i) 相当于 a[i] )
#define max(a,b) ( (a>b) ? a:b )
char* addBinary(char* a, char* b) {
int len_a = strlen(a); //不包括结束符'\0'的字符长度
int len_b = strlen(b);
int len = max( len_a, len_b)+1; //包括结束符'\0'
char* ret = (char* )calloc( len+1, sizeof(char) ); //预先分配带进位的字符串的空间
int i = len_a-1; //
int j = len_b-1;
int k = len-1;
int carry = 0; //进位标志
while( i>=0 || j>=0 ) //循环条件
{
int one = (i>=0) ? *(a+i)-'0':0; //字符位置右对齐(如100+1变为100+001)
int two = (j>=0) ? *(b+j)-'0':0;
int cur = one+two+carry;
*(ret+k) = cur%2 + '0'; //二进制加法,保存二进制的ASCII码于ret[k]中
carry = cur/2; //获得进位
if(i>=0)
i--;
if(j>=0)
j--;
k--;
}
if( carry!=0 ) //最高位有进位,首地址的字符应置'1'
{
*ret = '1'; //相当于ret[0] = '1'
return ret;
}
else //最高位没进位,故在申请的空间中,首地址的字符不属于生成字符串
return ret+1;
}