給定兩個二進制字符串,返回它們的和(也是二進制字符串)。本文提供從右向左逐位相加、處理進位、最後反轉字符串的完整 C 語言實現,並分析邊界情況與優化技巧。
char* addBinary(char* a, char* b) {
int i = strlen(a) - 1;
int j = strlen(b) - 1;
int carry = 0;
// 最大可能長度 = max(len_a, len_b) + 1 (進位) + 1 (\0)
int max_len = (i > j ? i : j) + 3;
char *result = (char*)malloc(max_len);
char *p = result; // 寫指針
while (i >= 0 || j >= 0 || carry) {
int sum = carry;
if (i >= 0) sum += a[i--] - '0';
if (j >= 0) sum += b[j--] - '0';
*p++ = (sum % 2) + '0'; // 存入低位
carry = sum / 2;
}
*p = '\0';
// 反轉字符串
int len = p - result;
for (int l = 0, r = len - 1; l < r; l++, r--) {
char tmp = result[l];
result[l] = result[r];
result[r] = tmp;
}
return result;
}
a = "11", b = "1" → "100"
a = "1010", b = "1011" → "10101"
a = "0", b = "0" → "0"
a = "1111", b = "1111" → "11110"
二進制字符串加法本質是基數為 2 的多精度加法。關鍵在於:正確處理字符與數值轉換、循環條件包含進位、結果反轉、內存管理。此模板可直接擴展至任意進制字符串加法(修改基數常量即可)。