1. 程式人生 > 其它 >劍指Offer面試題47(Java版):不用加減乘除做加法

劍指Offer面試題47(Java版):不用加減乘除做加法

題目描述

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

本題屬於思維題

解題思路

  • 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));
    }
}