这个问题比想象的要难。一开始没有考虑正负数相除的问题,解决的办法是把它们都转成正数,由于不能用乘除法,所以用计数器计算负数的个数,当且仅当负数个数为一是,结果要转成负数。然后遇到的问题是int的最大最小值是2147483647和-2147483648,如果把负数转成正数就会溢出,只好再转成负数。考虑到时间的问题,每次增加的步长为之前的2倍,不行的话再减小2倍,如果恢复到原始步长还不能解决,就退出循环。加了一些注释方便理解。
奇怪的是在64位环境中的Visual Studio Express 2013, C++的int输入-2147483648编译通不过。暂时不研究是不是正负数搞得对称了还是什么问题。转到Eclipse用Java解决了。
public class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0 || divisor == 0) {
return 0;
}
// if dividend and divisor have different sign, sign will be 1,
// otherwise it will be 0 or 2.
int sign = 0;
if (dividend > 0) {
dividend = -dividend; // use negative number, since the abs of min
// negative is bigger than max positive
// integer.
} else {
sign++;
}
if (divisor < 0) {
divisor = -divisor;
sign++;
}
int divisorStep = 0;
int resultStep = 0;
int result = 0;
while (dividend < 0) {
if (divisorStep != 0) {
if (dividend + divisorStep <= 0) {
dividend += divisorStep;
result += resultStep;
divisorStep += divisorStep; // try x2 next time
resultStep += resultStep;
} else {
divisorStep >>= 1; // try 1/2 next time
resultStep >>= 1;
}
} else {
if (dividend + divisor <= 0) { // base step
divisorStep = divisor;
dividend += divisor;
result++;
resultStep = 1;
} else {
break;
}
}
}
return sign == 1 ? -result : result;
}
}