int left = 1, right = Integer.MAX_VALUE, ans = 0; while (left <= right) { // 注意溢出,并且不能使用除法 int mid = left + ((right - left) >> 1); boolean check = quickAdd(divisor, mid, dividend); if (check) { ans = mid; // 注意溢出 if (mid == Integer.MAX_VALUE) { break; } left = mid + 1; } else { right = mid - 1; } }
return rev ? -ans : ans; }
// 快速乘 publicbooleanquickAdd(int y, int z, int x){ // x 和 y 是负数,z 是正数 // 需要判断 z * y >= x 是否成立 int result = 0, add = y; while (z != 0) { if ((z & 1) != 0) { // 需要保证 result + add >= x if (result < x - add) { returnfalse; } result += add; } if (z != 1) { // 需要保证 add + add >= x if (add < x - add) { returnfalse; } add += add; } // 不能使用除法 z >>= 1; } returntrue; } }