Divide Two Integers

本文介绍了一种使用位移运算实现整数除法的方法,并详细讨论了Integer.MIN_VALUE引起的溢出问题及解决方案。同时,给出了完整的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视频讲解  http://v.youku.com/v_show/id_XMTY1MTAyODM3Ng==.html


int 范围:

Integer.MIN_VALUE   =>   -2147483648

Integer.MAX_VALUE   =>   2147483647


overflow:

当被除数为 Integer.MIN_VALUE的时候,取绝对值或者除以-1都会造成溢出overflow.

Math.abs(-2147483648)   =>  -2147483648

Integer.MIN_VALUE/(-1)  =>   -2147483648


(1)把两个数转化成long类型,可以得到正确的绝对值

Long.MAX_VALUE   =>   9223372036854775807

Long.MIN_VALUE  =>   -9223372036854775808

long a = Math.abs((long)dividend);

long b = Math.abs((long)divisor);

Math.abs((long)-2147483648)  =>  2147483648


(2)题目中给出If it is overflow, return MAX_INT.

if(dividend == Integer.MIN_VALUE && divisor == -1)     

     return Integer.MAX_VALUE;



a=0,b=0, leetcode这道题中这个test case没有处理,所以暂时不需要考虑。

a<b, 被除数小于除数,结果为0。

a>=b,  通过b位移来得到b和a之间的倍数关系。

   4<<1  => 4*2,

   4<<2  => 4*2*2,

   4<<3  => 4*2*2*2,


a=25, b=4, result =0

当a>=b, a>0,b>0

    int count =0;记录位移的位数,

    如果a> b<<(count+1), count++;

 (1) count =0:  25 > 4<<1,  4*2=8 , count++;

    count=1:   25 > 4<<2,  4*2*2=16, count++;

    count=2:   25 > 4<<3,  4*2*2*2=32不成立,

    本轮循环结束,count=2;

     result += 1<<count;  result =1*2*2=4;

     a -= b<<count, a = 25 - 4*2*2 =9;


 (2)count=0, 9 > 4<<1, 4*2=8,count++;

     count=1, 9 > 4<<2, 4*2*2=16不成立,count=1

     本轮结束循环, count=1,

      result += 1<<count; result=4+1*2=6;

      a -= b<<count,  9-4*2=1, 1<4整个循环结束




由于a和b是被除数和除数的绝对值,如何判断两者符号是否相同?

    1^1  => 0

    1^0  => 1

    true^false    => true

    true^true     => false

    false^false  => false


    ((dividend>0)^(divisor>0))?(-result):result


    符号相同则为false,取result

    不同则为true,取-result的值



public class Solution {
    public int divide(int dividend, int divisor) {
        
        if(dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
        
        long a = Math.abs((long)dividend);
        long b = Math.abs((long)divisor);
        
        if(a<b) return 0;
        
        int result = 0;
        
        while(a>0 && b>0 && a>=b){
            int count = 0;
            while(a> b<<(count+1)){
                count++;
            }
            result += 1<<count;
            a -= b<<count;
        }
        return ((dividend>0)^(divisor>0))?(-result):result;
    }
}


下面是一个Java程序,名为ArithmeticT1,可以接受三个命令行参数:两个整数和一个算术运算符(+,-,*,/)。程序将对这两个整数执行相应的操作,并显示结果。请注意,您需要使用异常处理程序(try-catch语句)来处理非数字输入作为操作数(两个整数中的一个) - 如果任何操作数是非数字,则程序将终止,并在退出前显示带有错误操作数输入的消息。此外,程序还应处理运算符的错误输入。 ``` public class ArithmeticT1 { public static void main(String[] args) { if(args.length != 3) { System.out.println("Usage: java ArithmeticT1 operand1 operator operand2"); System.exit(1); } int operand1 = 0; int operand2 = 0; int result = 0; try { operand1 = Integer.parseInt(args[0]); operand2 = Integer.parseInt(args[2]); } catch (NumberFormatException ex) { System.out.println("Wrong operand input"); System.exit(1); } switch (args[1]) { case "+": result = operand1 + operand2; break; case "-": result = operand1 - operand2; break; case "*": result = operand1 * operand2; break; case "/": if (operand2 == 0) { System.out.println("Cannot divide by zero"); System.exit(1); } result = operand1 / operand2; break; default: System.out.println("Wrong operator input"); System.exit(1); } System.out.println(operand1 + " " + args[1] + " " + operand2 + " = " + result); } } ``` 这个程序首先检查是否有三个命令行参数。如果不是,则显示用法消息并退出程序。程序然后尝试将第一个和第三个参数解析为整数。如果任何一个参数不是整数,则显示错误消息并退出程序。如果两个参数都是整数,则根据第二个参数执行相应的算术运算。如果第二个参数是除法运算符,程序还会检查第二个操作数是否为零。如果是,则显示错误消息并退出程序。最后,程序将显示算术表达式和结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值