Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.算法
不使用除法,乘法和取餘,求兩個整數的相除的結果,若是有溢出就返回最大的整數。ide
任何一個整數能夠表示成以2的冪爲底的一組基的線性組合,即num=a_0*2^0+a_1*2^1+a_2*2^2+…+a_n*2^n。基於以上這個公式以及左移一位至關於乘以2,咱們先讓除數左移直到大於被除數以前獲得一個最大的基。而後接下來咱們每次嘗試減去這個基,若是能夠則結果增長加2^k,而後基繼續右移迭代,直到基爲0爲止。由於這個方法的迭代次數是按2的冪知道超過結果,因此時間複雜度爲O(log(n))。spa
算法實現類.net
public class Solution { public int divide(int dividend, int divisor) { // 相除時溢出處理 if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1) { return Integer.MAX_VALUE; } // 求符號位 int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1; // 求絕對值,爲防止溢出使用long long dvd = Math.abs((long) dividend); long dvs = Math.abs((long) divisor); // 記錄結果 int result = 0; // 被除數大於除數 while (dvd >= dvs) { // 記錄除數 long tmp = dvs; // 記錄商的大小 long mul = 1; while (dvd >= (tmp << 1)) { tmp <<= 1; mul <<= 1; } // 減去最接近dvd的dvs的指數倍的值(值爲tmp) dvd -= tmp; // 修正結果 result += mul; } return result * sign; } }