LeetCode 29. Divide Two Integers(除法)

7 篇文章 0 订阅
3 篇文章 0 订阅

原题网址:https://leetcode.com/problems/divide-two-integers/

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

方法一:使用长整数处理溢出问题。

public class Solution {
    public int divide(int dividend, int divisor) {
        if (divisor == 0) return 0;
        long ldividend = dividend;
        long ldivisor = divisor;
        boolean negative = false;
        if (ldividend < 0) {
            negative = !negative;
            ldividend = -ldividend;
        }
        if (ldivisor < 0) {
            negative = !negative;
            ldivisor = -ldivisor;
        }
        
        if (ldividend < ldivisor) return 0;

        long quotient = 1;
        long sum = ldivisor;
        while (ldividend - sum >= ldivisor) {
            long tq = 1;
            long tsum = ldivisor;
            while (ldividend - sum - tsum - tsum >= 0) {
                tq += tq;
                tsum += tsum;
            }
            // System.out.println("tq=" + tq);
            sum += tsum;
            quotient += tq;
        }
        // System.out.println(quotient);
        if (negative && -quotient <= Integer.MIN_VALUE) return Integer.MIN_VALUE;
        else if (!negative && quotient >= Integer.MAX_VALUE) return Integer.MAX_VALUE;
        if (negative) return (int)-quotient;
        return (int)quotient;
    }
}
方法二:分情况处理溢出问题。

public class Solution {
    /*
    好多坑,要测试{-最大值,-1,0,1,+最大值}的各种组合
    10
-3
-200000
1
-214748364
2
2147483647
1
-2147483648
2
-2147483648
-2147483648
-1
-1
-2147483648
-1
*/
    public int divide(int dividend, int divisor) {
        if (dividend == 0) return 0;
        if (divisor == 0) return Integer.MAX_VALUE;
        if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
        int HALF_POSITIVE = Integer.MAX_VALUE >> 1;
        int HALF_NEGATIVE = Integer.MIN_VALUE >> 1;
        // System.out.printf("HALF_NEGATIVE=%d\n", HALF_NEGATIVE);
        int quotient = 0;
        if (dividend > 0) {
            if (divisor > 0) {
                while (dividend - divisor >= 0) {
                    int m = divisor;
                    int p = 1;
                    while (m <= HALF_POSITIVE && dividend - m - m >= 0) {m += m; p += p;}
                    quotient += p;
                    dividend -= m;
                    if (dividend == 0) break;
                }
            } else {
                while (dividend + divisor >= 0) {
                    int m = divisor;
                    int p = -1;
                    while (m >= HALF_NEGATIVE && dividend + m + m >= 0) { m += m; p += p;}
                    quotient += p;
                    dividend += m;
                    if (dividend == 0) break;
                }
            }
        } else {
            if (divisor > 0) {
                while (dividend + divisor <= 0) {
                    int m = divisor;
                    int p = -1;
                    while (m <= HALF_POSITIVE && dividend + m + m <= 0) { m += m; p += p;}
                    quotient += p;
                    dividend += m;
                    if (dividend == 0) break;
                }
            } else {
                while (dividend - divisor <= 0) {
                    int m = divisor;
                    int p = 1;
                    while (m >= HALF_NEGATIVE && dividend - m - m <= 0) { m += m; p += p;}
                    quotient += p;
                    dividend -= m;
                    if (dividend == 0) break;
                }
            }
        }
        return quotient;
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值