LeetCode:Sum of Two Integers - 不使用加減法運算符的整數加法

一、題目名稱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

相關文章
相關標籤/搜索