Add Binary
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
例如,
a = "11"
b = "1"
Return "100"
.
分析:
首先检验二进制字符串的合法性,去点首尾的空格,是否有非法数字等(网上基本都没有检查,题目也没考虑),然后对应位相加。
注意进位,以及最高位是否有进位导致和的长度大于两个字符串长度。
char* addBinary(char* a, char* b) {
char carry = 0; /*进位*/
char *pa = a, *pb = b;
char *paEnd = NULL, *pbEnd = NULL;
char *pret = NULL; /*返回字符串*/
int iretLen = 0;
/*检验a字符串的合法性*/
if(*a == ' ' || *a == '\t')
{
while(*pa)
{
if(*pa == '0' || *pa == '1') /*找到第一个合法字符位置*/
{
a = pa;
break;
}
else if(*pa != ' ' && *pa != '\t') /*开始既不为0也不为1,也不为空格,错误*/
{
return NULL;
}
++pa;
}
}
while(*pa && (*pa == '0' || *pa == '1'))/*找到中间合法字符串*/
{
++pa;
}
if(!*pa)/*后面字符串都合法*/
{
paEnd = --pa;
}
else
{
while(*pa)
{
if(*pa != ' ' && *pa != '\t') /*字符串末尾含有非法字符*/
return NULL;
++pa;
}
}
/*检验b字符串的合法性*/
if(*b == ' ' || *b == '\t')
{
while(*pb)
{
if(*pb == '0' || *pb == '1') /*找到第一个合法字符位置*/
{
b = pb;
break;
}
else if(*pb != ' ' && *pb != '\t') /*开始既不为0也不为1,也不为空格,错误*/
{
return NULL;
}
++pb;
}
}
while(*pb && (*pb == '0' || *pb == '1')) /*找到中间合法字符串*/
{
++pb;
}
if(!*pb) /*后面字符串都合法*/
{
pbEnd = --pb;
}
else
{
while(*pb)
{
if(*pb != ' ' && *pb != '\t') /*字符串末尾含有非法字符*/
return NULL;
++pb;
}
}
/*计算二进制相加*/
iretLen = (((pbEnd-b)>(paEnd-a))?(pbEnd-b+1):(paEnd-a+1)) + 2;/*预留最高位进位和结尾符*/
pret = (char *)malloc(iretLen);
pret[--iretLen] = '\0';
--iretLen;
while(paEnd >= a || pbEnd >= b)
{
if(paEnd < a)
{
pret[iretLen--] = (*pbEnd - '0' + carry)%2 + '0';
carry = (*pbEnd - '0' + carry)/2;
--pbEnd;
continue;
}
if(pbEnd < b)
{
pret[iretLen--] = (*paEnd - '0' + carry)%2 + '0';
carry = (*paEnd - '0' + carry)/2;
--paEnd;
continue;
}
pret[iretLen--] = (*paEnd - '0' + *pbEnd - '0' + carry)%2 + '0';
carry = (*paEnd - '0' + *pbEnd - '0' + carry)/2;
--paEnd;
--pbEnd;
}
pret[0] = carry + '0';
if(pret[0] == '0')
{
pa = pret;
while(*pa)
{
*pa = *(pa + 1);
++pa;
}
}
return pret;
}