一、题目描述
输入两个二进制字符串,输出他们的和,并保存二进制字符串
Input: a = "11", b = "1" Output: "100"
二、思路
1.比较两个字符串,并选出最大长度len
2.动态申请内存保存相加后的二进制字符串,长度为(len+2),因为要考虑'\0'和最高位可能存在的进位
3.循环,求出相加后的本位和进位,并输出
三、C代码
char * addBinary(char * a, char * b){
int len_a = strlen(a);
int len_b = strlen(b);
int len = len_a > len_b ? len_a : len_b; //最大长度
int carry = 0;
char *res = (char *)malloc(sizeof(char) * (len + 2)); //申请内存,按最高位存在进位考虑
memset(res, 0, sizeof(char) * (len + 2));
res[len + 1] = '\0'; //字符串结尾为'\0'
while(len_a || len_b) //题意知两个字符串都不为空,肯定会进入循环
{
if(len_a)
{
carry += (a[--len_a] - '0'); //字符串a从最后开始转为整数
}
if(len_b)
{
carry += (b[--len_b] - '0'); //字符串b从最后开始转为整数,并与a相加
}
res[len--] = (carry % 2) + '0'; //求出相加后的本位,并转为字符
carry /= 2; //求出进位,供下次循环使用
}
res[0] = carry + '0'; //carry=0,则最高位为0,否则为1
return res + (carry ^ 1); //假如a="0",b="0",防止出现res="00"
}