第四題:兩數相除
阿新 • • 發佈:2018-12-30
問題描述
給定兩個整數,被除數 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; } }