Divide two integers without using multiplication, division and mod operator.
由于不能用乘号,除号,和取余。那么一个数除另外一个数,如a/b,实际含义是a中有多少个b,我们可以多次计算a-b,并更新a,最后a-b<0说明循环结束,循环的次数也即结果。
但是上面这种方法超时,如2147483647/1,那么循环次数为2147483647次。
所以考虑二分法来减少循环的次数。而且乘2,相对于左移一位,没有用到乘号。
代码:
class Solution { private: int res; public: int solve(long long dividend, long long divisor){ long long temp=1; while (divisor<=dividend) { divisor=divisor<<1; temp=temp<<1; } divisor=divisor>>1; temp=temp>>1; res+=temp; return dividend-divisor; } int divide(int dividend, int divisor) { res=0; bool fu=false; if(divisor==0) return -1; if(divisor==1) return dividend; long long my_dividend=(long long)dividend; long long my_divisor=(long long)divisor; if(my_dividend<0&&my_divisor<0){ my_dividend=0-my_dividend; my_divisor=0-my_divisor; fu=false; } if(my_dividend<0) {my_dividend=-my_dividend;fu=true;} if(my_divisor<0) {my_divisor=-my_divisor;fu=true;} while (((my_dividend=solve(my_dividend,my_divisor))-my_divisor)>=0); if(fu) res=-res; return res; } }; int main() { freopen("C:\Users\Administrator\Desktop\a.txt","r",stdin); Solution so; int a=0-2147483648; int b=0-1017100424; cout<<so.divide(a,b)<<endl; return 0; }