给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
本地编译器
#include <stdio.h>
#include <string.h>
//翻转函数
void reserve(char* s);
//相加函数
char* addBinary(char* a, char* b);
//输出函数
void Printf(char* s);
int main(void){
//初始化数据
char a[] = "11";
char b[] = "1";
//调用函数
addBinary(a, b);
}
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 len_a = strlen(a);
int len_b = strlen(b);
int n = len_a > len_b ? len_a : len_b;
int carry = 0, len = 0;
//存储数组长度增加两个空间,一个是用来存储'\0',还有一个是用来存储逢二进一的那个增加的一
char* ans = (char*)malloc(sizeof(char) * (n + 2));
//这里要理解len++ 是先执行后++,所以++后的len 都是给下一个语句使用的
for(int i = 0; i < n; ++i){
//将两个同下标的数字字符相加
//i < len_a :如果正确,继续判断a[i] 是否为'1',是则返回1,否则返回0
//如果错误则返回0,相加不改变数值
carry += i < len_a ? (a[i] == '1') : 0;
carry += i < len_b ? (b[i] == '1') : 0;
//如果carry > 2,代表上一次运算中有一个进一加到这次运算汇总,+'0' 是为了将数字改变成数字字符
ans[len++] = carry % 2 + '0';
//carry >= 2时,代表会留一个进一给下一次运算,< 2则代表将carry 初始化为0,没有进一给下一个
carry /= 2;
}
//如果carry 为1 的话,证明需要进一
if(carry){
ans[len++] = '1';
}
//为数组赋上结束符号
ans[len] = '\0';
reserve(ans);
//输出数据
//printf("%s", ans); //可以调用函数也可以直接使用printf()函数
Printf(ans);
}
void Printf(char* s){
int n = strlen(s);
for(int i = 0; i < n; i++){
printf("%c", s[i]);
}
}
本月更新进度 6/15
创作不易,你的点赞是我最大的动力!!!
我们下次再见 end~