Leetcode #29 Divide Two Integers 整数相除 解题报告

1 解题思想

就是两个整数相除,不能使用内置的运算,如果溢出那么久返回最大的整数

2 原题

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

If it is overflow, return MAX_INT.
题目需要拆解成一个基数为2的。请看我代码里面的那个连接

今天好忙来不及仔细说了,见谅

3 AC解

public class Solution {
    /** * http://www.tuicool.com/articles/FNrUvyE * 具体解析请看上面那个 * 可以拆解成2为基数的哪一个,值得学习! * */
    public int divide(int dividend, int divisor) {
        if(divisor==0)
            return Integer.MAX_VALUE;
        //注意这里做强制转换,给定了abs时调用的仍然是int,遇到负无穷会溢出,所以提前转换成long,注意括号内外都要转
        long a=Math.abs(dividend+0l),b=Math.abs(divisor+0l);
       // System.out.println(a+" "+b);
        if(b>a)
            return 0;
        long count=0,times=0;
        while(b<<1 <= a){
            b<<=1;
            times++;
        }
        while(times>=0){
         // System.out.println(a+" "+b+" "+count);
            if(a>=b){
                count+=1<<times;
                a-=b;
            }
            b>>=1;
            times--;
        }
        if((dividend^divisor)>>>31==1){
            return (int)-count;
        }
        else{
            //负数的绝对值比正数多一位,特别小心!!!
            int tmp=(int)count;
            if(tmp<0)
                return Integer.MAX_VALUE;
            else return tmp;
        }

    }
}

你可能感兴趣的:(LeetCode,整数相除)