zoukankan      html  css  js  c++  java
  • 【leetcode】Divide Two Integers (middle)☆

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

    If it is overflow, return MAX_INT.

    思路:

    尼玛,各种通不过,开始用纯减法,超时了。

    然后用递归,溢出了。

    再然后终于开窍了,用循环,把被除数每次加倍去找答案,结果一遇到 -2147483648 就各种不行, 主要是这个数一求绝对值就溢出了。

    再然后,受不了了,看答案。 发现,大家都用long long来解决溢出。看得我欲哭无泪啊。

    综合后AC的代码:

    int divide(int dividend, int divisor) {
            if(divisor == 1)
                return dividend;
            if(dividend == -2147483648 && abs(divisor) == 1)
                return 2147483647;
            
            int sign = (dividend > 0 ^ divisor > 0) ? -1 : 1;
            long long ans = 0;
            long long absdivisor = abs((long long)divisor);
            long long absdividend = abs((long long)dividend);
            long long t = absdivisor;
            long long n = 1;
            while(absdividend >= t + t) //被除数每次加倍,找到可以加到的最大值
            {
                t = t << 1;
                n = n << 1;
            }
            while(absdividend >= absdivisor) //从可以减的最大值开始,每次减,并把除数还原一部分
            {
                if(absdividend >= t)
                {
                    absdividend -= t;
                    ans += n;
                }
                n = n >> 1;
                t = t >> 1;
            }
    
            return sign * ans;
        }
  • 相关阅读:
    每周总结(第九周)
    每周总结(第七周)
    每周总结(第六周)
    成功案例和第五周总结
    结对编程和第四周总结
    每周总结(第三周)
    node.js爬取图片
    机器学习15 手写数字识别-小数据集
    机器学习13 14 深度学习-卷积
    机器学习12 垃圾邮件分类2(13)
  • 原文地址:https://www.cnblogs.com/dplearning/p/4278113.html
Copyright © 2011-2022 走看看