[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.

題目來源:leetcode

java:

 1 public class Solution {
 2     public String addBinary(String a, String b) {
 3         StringBuilder sb = new StringBuilder();
 4         int i = a.length() - 1, j = b.length() -1, carry = 0;
 5         while (i >= 0 || j >= 0) {
 6             int sum = carry;
 7             if (j >= 0) sum += b.charAt(j--) - '0';
 8             if (i >= 0) sum += a.charAt(i--) - '0';
 9             sb.append(sum % 2);
10             carry = sum / 2;
11         }
12         if (carry != 0) sb.append(carry);
13         return sb.reverse().toString();
14     }
15 }

 


思路:

計算機二進制加法運算:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM