1. 程式人生 > >第四題:兩數相除

第四題:兩數相除

問題描述

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數 dividend 除以除數 divisor 得到的商。

示例 1:

輸入: dividend = 10, divisor = 3
輸出: 3
示例 2:

輸入: dividend = 7, divisor = -3
輸出: -2
說明:

被除數和除數均為 32 位有符號整數。
除數不為 0。
假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。本題中,如果除法結果溢位,則返回 231 − 1。

Java程式碼展示

採用減法的位移代替除法。執行時間24ms,時間複雜度O(n^2),Beats 98.23% Java Solution。

class Solution {
    public int divide(int dividend, int divisor) {
        //處理異常
        if(divisor==0) return 0;
        int max=Integer.MAX_VALUE;
        int min=Integer.MIN_VALUE;
       //處理最大最小值取模的情況。
        long divid = (long)dividend;
        long divi = (long)divisor;
        //減少重複運算
        if(divi==1) return (int) divid;
        if(divi==-1){
            //處理溢位
            if(divid<=min)
                return max;
            return (int)-divid;
        }
        boolean flag=true;
        //處理符號
        if(divid<0){
            divid=-divid;
            if(divi<0){
                divi=-divi;
            }else{
                flag=false;
            }
        }else if(divi<0){
            divi=-divi;
            flag=false;
        }
        long res = 0;
        long tmp = 0;
        long cnt =1;
        while(divi<=divid){
            //2^n次方
            cnt = 1;
            tmp = divi;
            //找到第一個大於被除數的2^n次方
            while(tmp<=divid){
                tmp<<=1;
                cnt<<=1;
            }
            res+=(cnt>>1);
            //減去基數的前一個數
            divid-=(tmp>>1);
        }
        return flag?(int)res:(int)-res;    
    }
}

執行結果

在這裡插入圖片描述