給你兩個二進制字符串,返回它們的和(用二進制表示)。
輸入爲 非空 字符串且只包含數字 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~