トピック:67。バイナリ合計
2つのバイナリ文字列を指定し、それらの合計を(バイナリ表現で)返します。
入力は空ではない文字列であり、数値1と0のみが含まれています。
回答
方法1:ビット単位の加算を逆にして、データを直接保存します
char * addBinary(char * a, char * b)
{
// 进位
int carry = 0;
// 记录开辟空间大小
// 需要预留最高位进位、'\0'的空间
int length = (strlen(a)>strlen(b)? strlen(a)+2:strlen(b)+2);
// 开辟空间
char* result = (char*)malloc(sizeof(char)*length);
// 设置'\0'
result[length-1] = '\0';
// i记录a的最后一位
// j记录b的最后一位
// k记录result[]的最后一位,倒着存放求和结果
for(int i=strlen(a)-1 , j=strlen(b)-1 , k=length-2 ; (i>=0)||(j>= 0) ; i--,j--,k--)
{
// sum记录当前位数,先加上前一位的进位1或者0
int sum = carry;
// 位数不匹配时,要给空位赋0值,才能继续按位相加
sum += (i >= 0? a[i]-'0':0);
sum += (j >= 0? b[j]-'0':0);
// 更新进位值
// 方法一:
if(sum>1)
{
carry=1;
sum-=2;
}
else
{
carry=0;
}
result[k]=sum+'0';
// 方法二:对应位求和,然后求商作进位位,剩下的余数为结果位。
//carry = sum /2;
//result[k] = '0'+ sum % 2;
}
// 最高位无进位,直接返回
if(carry == 0)
// 此时result[0]为空,故指针+1
return result+1;
//有进位,补一个最高位
result[0] = '1';
return result;
}
方法2:最初に文字列を反転して数値形式の上位ビットと下位ビットに一致させ、それを追加して新しいスペースに格納し、最後に結果を反転して、
void reserve(char* s)
{
int len = strlen(s);
for (int i = 0; i < len / 2; i++)
{
char t = s[i];
s[i] = s[len - i - 1];
s[len - i - 1] = t;
}
}
char* addBinary(char* a, char* b)
{
reserve(a);
reserve(b);
int carry = 0;
int length = (strlen(a) > strlen(b) ? strlen(a) + 2 : strlen(b) + 2);
char* result = (char*)malloc(sizeof(char) * length);
result[length - 1] = '\0';
int i, j, k;
for (i = 0, j = 0, k = 0; (i < strlen(a)) || (j < strlen(b)); i++, j++, k++)
{
int sum = carry;
sum += (i < strlen(a) ? a[i] - '0' : 0);
sum += (j < strlen(b) ? b[j] - '0' : 0);
if (sum > 1)
{
carry = 1;
sum -= 2;
}
else
carry = 0;
result[k] = sum + '0';
}
if (carry == 0)
{
result[k] = '\0';
}
else
{
result[k] = '1';
}
reserve(result);
return result;
}