劍指Offer面試題47(Java版):不用加減乘除做加法
阿新 • • 發佈:2021-01-11
題目描述
寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。
本題屬於思維題
- java中自帶BigInteger類,可以把int數值轉為String型別; 然後使用BigInteger的 public BigInteger(String val)構造方法new出BigInteger物件;呼叫BigInteger的add方法,然後把結果轉為int型別。。
- 使用位操作符號,按位異或進行的是不進位加法,按位與是進行的判斷是否有進位。
-
5+7=12
第一步:相加各位的值,不算進位,得到2。
第二步:計算進位值,得到10. 如果這一步的進位值為0,那麼第一步得到的值就是最終結果。 -
同樣我們可以用三步走的方式計算二進位制值相加: 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)); } }