主要思路
用减法表示除法,看一共能减多少次。
若一次一次的减会报超时异常。
采用类似二分的思路,让a先于b * i(int范围内最大的数)相比,若a大,则可以减去i个b,然后再将i除2;若a小于b * i则直接让i除2。直到a < b 的时候才停止。
AC代码
class Solution {
public int divide(int a, int b) {
long n = 0;
long x = a; // 一开始就转为long,防止因为溢出出现奇奇怪怪的问题
long y = b;
// 符号处理
boolean flag = false;
if (x <0 && y < 0){
x = -1*x;
y = -1*y;
}else if (x <0 && y > 0){
flag = true;
x = -1*x;
}else if (x >0 && y < 0){
flag = true;
y = -1*y;
}
//将除法转变为了减法
long i = 2147483647;
while (true){
if (y*i > x){
i = i/2;
}else{
x = x - y*i;
n = n + i;
}
if (y > x){
break;
}
}
if (flag){
n = -1*n;
}
if (n< -2147483648 || n>2147483647){
return 2147483647;
}else{
return (int) n;
}
}
}