自己用减法写的,超时了,看的网上的资料:
假设 dividend 与 divisor 正负一致, divisor*(2^n) 为最接近 dividend 的 divisor 的幂,那么令 newdividend = dividend - divisor*(2^n),ans = ans + 2^n,问题就更新为 newdividend 除以 divisor,如此迭代。用 divisor*(2^n) 是因为 divisor 不停地辗转加自己就可以得到了。
有 -2147483648 这样的极限数据,因为 int 范围是 -2147483648~+2147483647,发现负数比正数范围“多1”,干脆把所有数都转成负数算,这样就避免用 long long 了。最后考察一下flag。
(如果转成正数的话,int 的 -(-2147483648)还是 -2147483648。。)
class Solution { public: int divide(int dividend, int divisor) { bool flag = false; if(divisor > 0) { divisor = -divisor; flag ^= true; } if(dividend > 0) { dividend = -dividend; flag ^= true; } int ans = 0, res = divisor, ex = 1; if(divisor < dividend) { return 0; } while(res >= dividend - res) { res += res; ex += ex; } while(res <= divisor && dividend) { if(res >= dividend) { dividend -= res; ans += ex; } res >>= 1; ex >>= 1; } return flag ? -ans : ans; } };
[LeetCode]Divide Two Integers,布布扣,bubuko.com
原文:http://blog.csdn.net/jet_yingjia/article/details/26684787