不用加減乘除做加法


  • 題目描述寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算符號

  • 思路1:java中自帶BigInteger類,可以把int數值轉為String類型;

      然后使用BigInteger的 public BigInteger(String val)構造方法new出BigInteger對象;

      調用BigInteger的add方法,然后把結果轉為int類型。

 1 import java.math.*;
 2 
 3 public class TwoSum1 {
 4 
 5     /**
 6      * 寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算符號。
 7      * 
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         System.out.println(Add(15, 45));
12     }
13 
14     public static int Add(int num1, int num2) {
15         BigInteger b1 = new BigInteger(String.valueOf(num1));
16         BigInteger b2 = new BigInteger(String.valueOf(num2));
17         int sum = b1.add(b2).intValue();
18         return sum;
19 
20     }
21 }
  • 思路2:使用位操作符號,按位異或進行的是不進位加法,按位與是進行的判斷是否有進位
 1 public class TwoSum2 {
 2     public int Add(int num1,int num2) {
 3         while (num2!=0) {
 4             int temp = num1^num2;
 5             num2 = (num1&num2)<<1;
 6             num1 = temp;
 7         }
 8         return num1;
 9     }
10 }
網友解釋:

解釋1:首先看十進制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算進位,得到2。 第二步:計算進位值,得到10. 如果這一步的進位值為0,那么第一步得到的值就是最終結果。 第三步:重復上述兩步,只是相加的值變成上述兩步的得到的結果2和10,得到12。 同樣我們可以用三步走的方式計算二進制值相加: 5-101,7-111 第一步:相加各位的值,不算進位,得到010,二進制每位相加就相當於各位做異或操作,101^111。 第二步:計算進位值,得到1010,相當於各位做與操作得到101,再向左移一位得到1010,(101&111)<<1。 第三步重復上述兩步, 各位相加 010^1010=1000,進位值為100=(010&1010)<<1。 繼續重復上述兩步:1000^100 = 1100,進位值為0,跳出循環,1100為最終結果。

解釋2:13+11 = ?;

13 的二進制      1 1 0 1                     -----a        13
11 的二進制      1 0 1 1                     -----b        11  

 (a&b) <<1  ->   1 0 0 1 0                         -----d         18
          a^b  ->     0 1 1 0                   -----e          6

 (d&e) <<1  ->   0 0 1 0 0                       ------f         4
          d^e  ->  1 0 1 0 0                  -----g        20

 (f&g) <<1  ->   0 1 0 0 0                       ------h        8
          f^g  ->  1 0 0 0 0                    ------i           16

 (h&i) <<1  ->   0 0 0 0 0                       ------h        0       ---- --------退出循環
          h^i  ->  1 1 0 0 0                  ------i           24


免責聲明!

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



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