用减法会超时,所以用除数倍增的方法来实现除法。
以100/3为例.
算法分别比较97, 94, 91, ..., 4,1, -2,最后dividend = -2退出while循环.算法比较了34次.
如果采用每次采用将比较数翻倍的比较方法. 算法会得到优化. 举例如下: k初始化为0, res = 0;
首先用3与100比,小于. 然后翻倍6, 小于. 12, 24, 48, 96, 192, 因为192 > 100. 退回到 96. 这里共比较了 5次. 每比较一次 k++, res += 1<<k.
100 - 96 = 4 > 除数3. 再用4重做上一步. 先跟3比较, 然后6, 6 > 4. 这次比较2次.
回到3. 4 - 3 = 1 < 除数3. 算法停止. 总共比较了5 + 2 + 1 = 8次, 比原来的34次快了很多.
最恶心的是必须是long long类型,否则超时。另外同样是加法,|=和+=相比明显更快。
class Solution { public: int divide(int dividend, int divisor) { int i=0; if(dividend==0)return 0; bool negetive=false; long long divid=dividend; long long divis=divisor; if(dividend<0){negetive=!negetive;divid=-divid;} if(divisor<0){negetive=!negetive;divis=-divis;} if(divis==1)i=divid; else { while(divid >= divis) { long long temp = divis; int k=1; while(temp+temp <= divid) { k <<= 1; temp = temp + temp; } i |= k; divid -= temp; } } if(negetive)i=-i; return i; } };