兩個整數相除

原題

  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;
    }
}
相關文章
相關標籤/搜索