题目
Divide two integers without using multiplication, division and mod operator.
不能用乘 或 除 或 模 操作。
思路
(1)被除数÷除数 = 商
(2)直接用除数去一个一个加(或被除数一个一个减),直到被除数被超过的话,会超时。
(3)其实我们可以加快除数的增加进程,每次翻一番,即每次将除数增加1倍,同时将 count 也增加一倍,如果超过了被除数,那么用被除数减去当前和再继续本操作。
(4)累加除数,判断是否大于被除数。
代码如下:
class Solution {
public:
int divide(int dividend, int divisor) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int ret = 0;
if(dividend == 0 || divisor == 0) return 0;
int sign = 1; // 1 : positive; -1 : negative
if(dividend < 0) sign *= -1;
if(divisor < 0) sign *= -1;
long long tmpDiv = dividend;
long long divL = abs(tmpDiv);
long long tmpDivisor = divisor;
long long divisorL = abs(tmpDivisor);
while(divL >= divisorL){
int count = 1; // first: divL > divisorL
long long sum = divisorL; // long long, cal divisorL
while(sum + sum <= divL){
count += count;
sum += sum;
}
divL -= sum;
ret += count;
}
return sign * ret;
}
};
以上代码引用地址 IT-Homer
注意:
1) 设置符号位sign,判断符号
2) 对 dividend 和 divisor 都先转化成 long long 类型,防止负数转化成正整数时溢出;
例如 若将 long long tmpDiv = dividend; long long divL = abs(tmpDiv); 合并成 long long divL = abs(dividend); 就会出现错误或超时;
3) 除数之和 sum,必须设置成 long long,防止溢出
其实时间复杂度还是很高,其他较好的方法待续......