一、题目名称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