LeetCode Q29 两数相除

Q29 两数相除

题目描述:

不使用乘法、除法以及mod运算符,实现两整数相除,结果截去小数部分。输入保证除数(divisor)不为0,如果结果溢出,则返回Integer.MAX_VALUE

思路:

作差法求解。

将被除数(dividend)与除数(divisor)不断作差,直至被除数小于除数。

除法结果用long型数据保存,以避免溢出。

每次作差之后被除数翻倍,以提高作差效率,以避免超时。

Java代码实现:

package com.peng.leetcode;

/**
 * 不使用乘法、除法和mod运算符,实现两整数相除,结果截去小数部分
 * 输入保证除数不为0
 */
public class Q29 {


    public static void main(String[] args) {
        System.out.println(divide(-2147483648, 1));

    }


    /**
     * 思路:通过作差法实现除法,使用long型数据来解决溢出问题,通过被减数(被除数)的翻倍与还原避免超时
     * @param dividend
     * @param divisor
     * @return
     */
    public static int divide(int dividend, int divisor) {

        long result = 0;

        boolean flag = false;  //true表示结果为正,false表示结果为负

        if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) {
            flag = true;
        }

        long a = dividend;
        long b = divisor;

        a = Math.abs(a);
        b = Math.abs(b);

        int k = 1;
        long c = b;

        while (a >= b) {
            result += k;
            a -= b;

            if(a >= b*2) {  //每做差一次就将减数翻倍,提高做差效率,避免超时
                b *= 2;
                k *= 2;
            } else {  //不够减时,则将减数还原为原来的大小
                b = c;
                k = 1;
            }

        }

        if(!flag) {
            result = -result;
        }

        if(result < Integer.MIN_VALUE || result > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        }

        return (int)result;
    }

}

上一篇:quarkus为什么比spring boot 启动快


下一篇:Codeforces Round #538 (Div. 2)