一、題目名稱java
Sum of Two Integers(不使用加減法運算符的整數加法)es5
二、題目地址code
https://leetcode.com/problems/sum-of-two-integers/leetcode
三、題目內容get
英文:io
Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.class
中文:方法
計算兩個整數的和,但不容許使用運算符+和-英文
四、解題方法1文件
雖然題目中明確表示不讓用戶使用加法運算符與減法運算符,不過下面兩種寫法仍是能得到Accept:
1)Java代碼:直接使用a+b做爲返回值
public class Solution { public int getSum(int a, int b) { return a + b; } }
2)Java代碼:使用a-(-b)做爲返回值
public class Solution { public int getSum(int a, int b) { return a - (-b); } }
五、解題方法2
解題方法1中列舉的兩種方法雖然能得到Accept,但以這種方式解題明顯不是命題人的本意。既然不讓用加減法解決兩數求和的問題,那咱們就只能求助位運算了。
設相加的兩數爲a和b,解題思路以下:
一、若是不考慮進位,a^b爲a+b中各位數字相加的和
二、若是考慮進位,(a&b)<<1爲各位數字相加後應有的進位
三、a+b能夠轉換爲其等價形式(a^b)+(a&b)<<1
四、當(a&b)爲0時,(a&b)<<1也爲0,此時a^b即爲所求
寫成Java代碼,就是:
/** * 不使用加減法運算符的整數加法 * @文件名稱 Solution.java * @文件做者 Tsybius2014 * @建立時間 2016年7月19日 上午9:37:37 */ public class Solution { /** * 不使用加減法運算符的整數加法 * @param a 加數a * @param b 加數b * @return a與b的和 */ public int getSum(int a, int b) { int x = a & b; int y = a ^ b; if (x == 0) { return y; } else { return getSum(y, x << 1); } } }
若是還不能理解這段代碼,能夠用下面的方式打印計算中的各中間值:
/** * 不使用加減法運算符的整數加法 * @文件名稱 Solution.java * @文件做者 Tsybius2014 * @建立時間 2016年7月19日 上午9:37:37 */ public class Solution { /** * 不使用加減法運算符的整數加法 * @param a 加數a * @param b 加數b * @return a與b的和 */ public int getSum(int a, int b) { printNum(a, b); int x = a & b; int y = a ^ b; if (x == 0) { return y; } else { return getSum(y, x << 1); } } /** * 打印中間結果 * @param num1 加數a * @param num2 加數b */ public void printNum(int num1, int num2) { System.out.println("----- PRINT NUM -----"); //加數a String bin1 = Integer.toBinaryString(num1); while (bin1.length() < 32) bin1 = "0" + bin1; String res1 = "a:" + num1 + "\n bin(a):" + bin1; System.out.println(res1); //加數b String bin2 = Integer.toBinaryString(num2); while (bin2.length() < 32) bin2 = "0" + bin2; String res2 = "b:" + num2 + "\n bin(b):" + bin2; System.out.println(res2); //a&b String bin3 = Integer.toBinaryString(num1 & num2); while (bin3.length() < 32) bin3 = "0" + bin3; String res3 = "&:" + (num1 & num2) + "\n bin(&):" + bin3; System.out.println(res3); //a^b String bin4 = Integer.toBinaryString(num1 ^ num2); while (bin4.length() < 32) bin4 = "0" + bin4; String res4 = "^:" + (num1 ^ num2) + "\n bin(^):" + bin4; System.out.println(res4); //a+b String bin5 = Integer.toBinaryString(num1 + num2); while (bin5.length() < 32) bin5 = "0" + bin5; String res5 = "+:" + (num1 + num2) + "\n bin(+):" + bin5; System.out.println(res5); System.out.println(); } }
另a爲123,b爲456,控制檯中打印的結果以下:
----- PRINT NUM ----- a:123 bin(a):00000000000000000000000001111011 b:456 bin(b):00000000000000000000000111001000 &:72 bin(&):00000000000000000000000001001000 ^:435 bin(^):00000000000000000000000110110011 +:579 bin(+):00000000000000000000001001000011 ----- PRINT NUM ----- a:435 bin(a):00000000000000000000000110110011 b:144 bin(b):00000000000000000000000010010000 &:144 bin(&):00000000000000000000000010010000 ^:291 bin(^):00000000000000000000000100100011 +:579 bin(+):00000000000000000000001001000011 ----- PRINT NUM ----- a:291 bin(a):00000000000000000000000100100011 b:288 bin(b):00000000000000000000000100100000 &:288 bin(&):00000000000000000000000100100000 ^:3 bin(^):00000000000000000000000000000011 +:579 bin(+):00000000000000000000001001000011 ----- PRINT NUM ----- a:3 bin(a):00000000000000000000000000000011 b:576 bin(b):00000000000000000000001001000000 &:0 bin(&):00000000000000000000000000000000 ^:579 bin(^):00000000000000000000001001000011 +:579 bin(+):00000000000000000000001001000011
END