[劍指Offer]-不用加減乘除做加法

題目描述

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

本題屬於思維題

解題思路

  • java中自帶BigInteger類,可以把int數值轉爲String類型; 然後使用BigInteger的 public BigInteger(String val)構造方法new出BigInteger對象;調用BigInteger的add方法,然後把結果轉爲int類型。。
  • 使用位操作符號,按位異或進行的是不進位加法,按位與是進行的判斷是否有進位。
算法圖解
  • 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爲最終結果。

在這裏插入圖片描述

參考代碼:
package offer;
import java.math.*;

public class TwoSum1 {

    /**
     * 寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算符號。
     * 
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(Add(15, 45));
    }

    public static int Add(int num1, int num2) {
        BigInteger b1 = new BigInteger(String.valueOf(num1));
        BigInteger b2 = new BigInteger(String.valueOf(num2));
        int sum = b1.add(b2).intValue();
        return sum;

    }
}

package offer;

/**
 * 不用加減乘除做加法
 */
public class Offer65 {
    public static void main(String[] args) {
        int sum, carry;
        int num1, num2;
        num1 = 50;
        num2 = 7;
        do {
            sum = num1 ^ num2;                          //相加不進位 異或
            carry = (num1 & num2) << 1;                   // 同1才產生進位 產生進位  記下
            num1 = sum;                               // 兩數相加 循環重複  直到不產生 進位
            num2 = carry;
        }
        while (num2 != 0);
        System.out.printf(String.valueOf(num1));
    }
}


附錄

該題源碼在我的 ?Github 上面!

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