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;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值