1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[leetcode]Divide Two Integers

Posted on 2014-01-18 20:20  1957  阅读(2872)  评论(0编辑  收藏  举报

* / mod 不能用

其实想想,乘法不就是加法嘛

a*b = b个a相加

 x / y = n 其实是 x = ny + r

我们来累加y,知道ny >=  x

就可以求的n了

但是这里又有个麻烦那的就是。。。累加的话,按我们的条件肯定是多算了一次啦

判断ny == x 不等就减去一次就ok

不过这样的结果就是TLE

INT_MAX和1,显然要枚举INT_MAX次

 

那肿么办。。。

一次一次的枚举确实有点2。。。

但就用增量吧,每次*2

这样的想法是对的

但是。。问题是,累加。。。最后还是多算,觉得处理起来很麻烦啊

那换个似乎。。。我们用x每次减去y

直到x < y,那就是刚好

经常遇到这样的问题,感觉很麻烦,换个角度就方便很多啊

 

class Solution {
public:
    int divide(int dividend, int divisor) {
        // without using * / mod
        // using add
        auto sign = [=](int x) {
            return x < 0 ? -1 : 1;
        };
        int d1 = sign(dividend);
        int d2 = sign(divisor);
        long long n1 = abs(static_cast<long long>(dividend));
        long long n2 = abs(static_cast<long long>(divisor));
        long long ans = 0;
        while(n1 >= n2) {
            long long base = n2;
            for(int i = 0 ; n1 >= base ; ++i) {
                n1 -= base;
                base <<= 1;
                ans +=  1LL << i;
            }
        }
        int res = static_cast<int>(ans);
        if(d1 != d2) return -res;
        else return res;
    }
};