码迷,mamicode.com
首页 > 其他好文 > 详细

Divide Two Integers

时间:2016-07-20 01:10:07      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

 

 

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

 

Divide Two Integers

标签:

原文地址:http://www.cnblogs.com/iwangzheng/p/5686809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!