Divide Two Integers

简介: 不能使用乘法,除法和mod operator,实现除法功能。 Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 用减法可以实现,但是太慢了。

不能使用乘法,除法和mod operator,实现除法功能。

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

If it is overflow, return MAX_INT.

用减法可以实现,但是太慢了。算法里所做的优化都是为了节省时间。

不能忽视溢出的问题。例如,被除数是Integer.MIN_VALUE,除以-1,得到的结果对于Int型来说就溢出了,因此返回Integer.MAX_VALUE

先处理符号,处理两个极端情况。其余的先转为long正数后递归处理。

除数每次左移位数都增加,这加快了运算效率。把每次递归产生的左移次数都加起来,即是结果。

Java代码:

    public int divide(int dividend, int divisor) {
        int sign = ((dividend ^ divisor)>>>31) == 1? -1:1;
        if (dividend == 0) {
            return 0;
        }
        if (divisor == 0) {
            return Integer.MAX_VALUE;
        }
        if(divisor == -1 && dividend == Integer.MIN_VALUE) {
            return Integer.MAX_VALUE;//overflow
        }
        long n1 = Math.abs((long) dividend);//avoid overflow
        long n2 = Math.abs((long) divisor);
        return (int) (div(n1,n2)*sign);
    }
        public long div(long n1, long n2){
        if (n1 < n2) {
            return 0;
        }
        int i = 0;
        while(n1 > (n2 << (i+1))){
            i++;
        }
        return (1<<i) + div(n1 - (n2<<i), n2);
    }

 这个问题有3点启示:

1、注意溢出的问题,该转换的就转换

2、关注运行效率的问题

3、移位方法的运用

目录
相关文章
LeetCode之Sum of Two Integers
LeetCode之Sum of Two Integers
117 0
|
人工智能 算法
1305 Pairwise Sum and Divide
1305 Pairwise Sum and Divide 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:   fun(A)     sum = 0     for i = 1 to A.
837 0
[LeetCode]--29. Divide Two Integers
Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 以前我记得做过乘法变加法吧,这个有点像除法变减法,用位运算,二进制嘛,左移一位相当于乘以二。 一个有趣的是 Math.abs(-2147483648
1127 0
[LeetCode] Sum of Two Integers
The code is as follows. public class Solution { public int getSum(int a, int b) { return b == 0 ? a : getSum(a ^ b, (a & b)
1120 0
LeetCode 216 Combination Sum III(Backtracking)(*)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/51935033 翻译 找出所有的k个数字相加得到数字n的组合,只有1到9的数字可以被使用,并且每个组合间需要是不同的数字集。
731 0