題目描述
寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算符號。
本題屬於思維題
解題思路
- 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 上面!