zoukankan      html  css  js  c++  java
  • Divide Two Integers

     视频讲解  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;
        }
    }
  • 相关阅读:
    ZOJ-3230-Solving the Problems
    zoj-3410-Layton's Escape
    cin输入超过文本末尾
    sizeof('a')
    WPF TranslatePoint/TransformToVisual 总返回零
    Lock-free multi-threading
    c++0X 用字符串调用函数
    Vim 的c++语法补齐
    Reentrancy VS Thread safe
    内存屏障
  • 原文地址:https://www.cnblogs.com/iwangzheng/p/5686809.html
Copyright © 2011-2022 走看看