【題解】二進制求和

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章