# Leetcode 67. Add Binary (C語言) - 題目 Given two binary strings, return their sum (also a binary string). The input strings are both non-empty and contains only characters 1 or 0. - 範例 Input: a = "11", b = "1" Output: "100" ```c= char * addBinary(char * a, char * b){ int la=strlen(a),lb=strlen(b); int lc=la>lb? la:lb; char* c=(char*)malloc((lc+1)); c[lc]='\0'; int i,carry=0; for(i=0;i<lc;i++){ if(la)carry+=a[--la]-'0'; if(lb)carry+=b[--lb]-'0'; c[lc-1-i]=(carry&1)+'0'; carry>>=1; } if(carry==1){ c=(char*)realloc(c,lc+2); for(i=lc;i>=0;i--){ c[i+1]=c[i]; } c[0]='1'; } return c; } ``` 思路:以carry為主來批次計算 ``` carry 110 a 11 + b 1 ---------------- 100 ``` la,lb為string a,b的個別長度,lc即c之長度(取a,b大者) c就動態宣告lc+1格,其中char bit=1,sizeof(char)可省,且要留多一格放\0(結尾字元) 當中carry&1與carry>>=1什麼意思? carry&1即把carry與1在二進制下做and運算(皆為1才=1,其他=0), 以範例跑第一輪計算時carry=a最右bit+b最右bit=2 即carry=2(十進位)=10(二進位) ``` carry 10 & 1 //1&0=0 ----------------- c[lc-1-i]= 0 carry 10 >> //即向右平移 ---------------- 1 ``` 如果for跑完carry還=1代表還要進位,但是宣告的格子數不夠了就要realloc更大的空間。 (也可以一開始就宣告多一格,但是如果沒有進位會造成空間浪費,這是時間與空間的選擇)