1. 程式人生 > >[c++]用字符串實現二進制的加法

[c++]用字符串實現二進制的加法

add 註意 ret style nta lee public ddb ase

題目描述:

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.

題目來源:leetcode


思路:

計算機二進制加法運算:

計算機計算二進制加法是分三部,第一步為將兩個加數轉換為二進制數,計算兩個加數不需要進位的和(利用異或運算 ^ ),得出的結果。第二部將兩個加數進行與運算(&)。第三部利用與運算得到結果進行左移運算(<<)(同時為計算兩個加數需要進位的和),得出結果。將或異運算的結果和左移運算的結果作為兩個新的加數,重復此操作。直到當與運算的結果為0,則異或運算的結果則為兩個加數的和所對應的二進制數。

來源:https://blog.csdn.net/gaoyubo_taili/article/details/79694729


註意事項:

  • 這是一個遞歸的算法
  • 結果要考慮全為0的情況
  • 除去前端多余的0,用erase函數
  • 剛開始就要把兩字符串的長度匹配好

全部代碼:

 1 string s_xor(string a,string b)
 2 {
 3     int size=a.size();
 4     string c(size,0);
 5     for(int i=0;i<size;++i)
 6     {
 7         if(a[i]==b[i]) c[i]=0;
8 else c[i]=1; 9 } 10 return c; 11 } 12 string s_and(string a,string b) 13 { 14 int size=a.size(); 15 string c(size,0); 16 for(int i=0;i<size;++i) 17 { 18 if(a[i]==b[i]&&a[i]==1) c[i]=1; 19 else c[i]=0; 20 } 21 return c; 22 }
23 bool is_0(string a) 24 { 25 26 for(int i=0;i<a.size();++i) 27 if(a[i]!=0) return false; 28 return true; 29 } 30 class Solution { 31 public: 32 string addBinary(string a, string b) { 33 int size=a.size()>=b.size()?a.size():b.size(); 34 a=string (size-a.size(),0)+a; 35 b=string (size-b.size(),0)+b; 36 if(is_0(s_and(a,b))) { 37 string c=s_xor(a,b); 38 int i=0; 39 if(is_0(c)) return "0"; 40 while(c[i]==0) 41 { 42 c.erase(c.begin()+i); 43 } 44 return c; 45 } 46 else { 47 return addBinary(s_and(a,b)+"0",s_xor(a,b)); 48 49 } 50 } 51 };

[c++]用字符串實現二進制的加法