1. 程式人生 > 其它 >LeetCode 0029 Divide Two Integers

LeetCode 0029 Divide Two Integers

原題傳送門

1. 題目描述

2. Solution 1

1、思路分析
思路:
商 x 除數 + 餘數 = 被除數
可以把一個dividend(被除數)先除以2n,n最初為31,不斷減小n去試探,當某個n滿足dividend/2n>=divisor時,
表示我們找到了一個足夠大的數,這個數*divisor是不大於dividend的,所以我們就可以減去2^n個divisor,以此類推

2、程式碼實現

package Q0099.Q0029DivideTwoIntegers;

/*
   思路:
       商 x 除數 + 餘數 = 被除數
    可以把一個dividend(被除數)先除以2^n,n最初為31,不斷減小n去試探,當某個n滿足dividend/2^n>=divisor時,
    表示我們找到了一個足夠大的數,這個數*divisor是不大於dividend的,所以我們就可以減去2^n個divisor,以此類推
 */
public class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend == 0) return 0;
        if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
        boolean negative;
        negative = (dividend ^ divisor) < 0;   // 用異或來計算是否符號相異
        long t = Math.abs((long) dividend);
        long d = Math.abs((long) divisor);
        int result = 0;
        for (int i = 31; i >= 0; i--) {
            if ((t >> i) >= d) {
                result += 1 << i;
                t -= d << i;
            }
        }
        return negative ? -result : result;   // 符號相異取反
    }
}