不用除法來實現兩個正整數的除法


題目描述:編程實現兩個正整數的除法,當然不能用除法操作。
題目來自昨天上午遠程面試牛客網的算法題,數據結構和算法一直是我的薄弱項,所以此次面試最后也不大理想。不得不說,面試官人還是很好的,一直在給我提示,可是終究因為自己能力不夠而沒過。。。

我的答案

剛開始,我寫出了如下的代碼,基本上是符合條件可以運行的:

/**
 * Created by clearbug on 2018/2/26.
 */
public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.div(2, 3));
        System.out.println(s.div(3, 2));
        System.out.println(s.div(5, 2));
        System.out.println(s.div(6, 2));
    }

    /**
     * 兩個正整數的除法
     *
     * @param x
     * @param y
     * @return
     */
    public int div(int x, int y) {
        if(x < y) {
            return 0;
        }
        int res = 0;
        while(x - y >= 0) {
            res++;
            x = x - y;
        }
        return res;
    }

}

代碼雖然可以正確運行,但是確實有效率問題的:比如說,當 x 很大 y 卻很小時。
面試官說:可以利用類似二分查找的思想來提高效率
我說:二分查找求中值是需要除法的啊,但是這道題目規定不能使用除法的
面試官說:求中值不一定非得用除法,比如可以用移位操作
然后我雖然有了點思路,但並沒有清楚的表達出來。現在已經面試完了,就在寫下這種方法吧:

/**
 * Created by clearbug on 2018/2/26.
 */
public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.div(2, 3));
        System.out.println(s.div(3, 2));
        System.out.println(s.div(5, 2));
        System.out.println(s.div(6, 2));
        System.out.println(s.div(13, 3));
        System.out.println(s.div(26, 3));
        System.out.println(s.div(26, 2));
    }

    /**
     * 兩個正整數的除法
     *
     * @param x
     * @param y
     * @return
     */
    public int div(int x, int y) {
        if(x < y) {
            return 0;
        }
        int res = 0;
        while (x >= y) {
            int multi = 1;
            while (y * multi <= x >> 1) {
                multi = multi << 1;
            }
            res += multi;
            x = x - y * multi;
        }

        return res;
    }

}

好吧,我承認我自己並沒有寫出來,我是參考了這位老鐵的代碼寫的:http://www.xuebuyuan.com/3120516.html
現在我也沒完全想明白為啥要與 x 的一半做比較,以后想明白了再說吧!

參考

  1. http://www.xuebuyuan.com/3120516.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM