题目描述
给你两个二进制字符串 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;
}