Divide two integers without using multiplication, division and mod operator.
题目解析:
求两个数相除,不能用乘除法。那么可以用加减法一点一点算。再有个计数变量,就能得到最后的结果。但是这样会超时。
怎么办?这时二分法就起作用了。我们一次加上当前和的倍数,那么就成倍的增加。当sum+sum > dividend的时候。我们就用dividend-sum;然后用新的值从sum=divisor开始重新求解。
我一开始用的递归的方法,结果也是超时了。以为这种方法不行。但改用非递归的形式,就能得到正确结果了。说明,能用非递归尽量用非递归。
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend == 0 || divisor == 0)
return 0;
bool flag = false;
if((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0))
flag = true;
long long c = dividend; //先用long long变量保存两个值,否则负数最大值求正数的时候会越界。
long long d = divisor; //即使将int变量abs(dividend)赋值给long long变量也会越界。应该先扩展
long long a = abs(c);
long long b = abs(d);
long long sum = 0;
int count = 0;
int n = 0;
while(a >= b){
sum = b;
count = 1;
while(sum + sum <= a){
sum += sum;
count += count;
}
a -= sum;
n += count;
}
if(flag)
return 0-n;
return n;
}
};