题目描述
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = “11”, b = “1”
输出:“100”
示例 2:
输入:a = “1010”, b = “1011”
输出:“10101”
提示:
- 1 <= a.length, b.length <= 104
- a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成
- 字符串如果不是 “0” ,就不含前导零
解题方法
- C
void reserve(char* str) // 翻转字符串 { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = temp; } } char* addBinary(char* a, char* b) { int len_a = strlen(a), len_b = strlen(b); // 获取字符串长度 int max = fmax(len_a, len_b); // 获取最大长度 char* ans = (char*)malloc(sizeof(char) * (max + 2)); // 申请内存,包含进位和'\0' int carry = 0, len = 0; reserve(a); // 翻转字符串 reserve(b); for (int i = 0; i < max; ++i) { if(i < len_a) { if(a[i] == '1') { carry += 1; } else { carry += 0; } } if(i < len_b) { if(b[i] == '1') { carry += 1; } else { carry += 0; } } ans[len++] = carry % 2 + '0'; // 计算当前位 carry /= 2; // 计算进位 } if (carry) // 判断是否还有进位 { ans[len++] = '1'; // 进位 } ans[len] = '\0'; // 末尾加'\0' reserve(ans); // 字符串翻转 return ans; }