// 快速乘 auto quickAdd = [](int y, int z, int x) { // x 和 y 是负数,z 是正数 // 需要判断 z * y >= x 是否成立 int result = 0, add = y; while (z) { if (z & 1) { // 需要保证 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; }; int left = 1, right = INT_MAX, ans = 0; while (left <= right) { // 注意溢出,并且不能使用除法 int mid = left + ((right - left) >> 1); bool check = quickAdd(divisor, mid, dividend); if (check) { ans = mid; // 注意溢出 if (mid == INT_MAX) { break; } left = mid + 1; } else { right = mid - 1; } }
classSolution { publicintdivide(int dividend, int divisor) { // 考虑被除数为最小值的情况 if (dividend == Integer.MIN_VALUE) { if (divisor == 1) { return Integer.MIN_VALUE; } if (divisor == -1) { return Integer.MAX_VALUE; } } // 考虑除数为最小值的情况 if (divisor == Integer.MIN_VALUE) { return dividend == Integer.MIN_VALUE ? 1 : 0; } // 考虑被除数为 0 的情况 if (dividend == 0) { return0; } // 一般情况,使用二分查找 // 将所有的正数取相反数,这样就只需要考虑一种情况 booleanrev=false; if (dividend > 0) { dividend = -dividend; rev = !rev; } if (divisor > 0) { divisor = -divisor; rev = !rev; } intleft=1, right = Integer.MAX_VALUE, ans = 0; while (left <= right) { // 注意溢出,并且不能使用除法 intmid= left + ((right - left) >> 1); booleancheck= 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 是否成立 intresult=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; } }
publicclassSolution { publicintDivide(int dividend, int divisor) { // 考虑被除数为最小值的情况 if (dividend == int.MinValue) { if (divisor == 1) { returnint.MinValue; } if (divisor == -1) { returnint.MaxValue; } } // 考虑除数为最小值的情况 if (divisor == int.MinValue) { return dividend == int.MinValue ? 1 : 0; } // 考虑被除数为 0 的情况 if (dividend == 0) { return0; } // 一般情况,使用二分查找 // 将所有的正数取相反数,这样就只需要考虑一种情况 bool rev = false; if (dividend > 0) { dividend = -dividend; rev = !rev; } if (divisor > 0) { divisor = -divisor; rev = !rev; } int left = 1, right = int.MaxValue, ans = 0; while (left <= right) { // 注意溢出,并且不能使用除法 int mid = left + ((right - left) >> 1); bool check = quickAdd(divisor, mid, dividend); if (check) { ans = mid; // 注意溢出 if (mid == int.MaxValue) { break; } left = mid + 1; } else { right = mid - 1; } }
return rev ? -ans : ans; }
// 快速乘 publicboolquickAdd(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; } }
# 考虑被除数为最小值的情况 if dividend == INT_MIN: if divisor == 1: return INT_MIN if divisor == -1: return INT_MAX # 考虑除数为最小值的情况 if divisor == INT_MIN: return1if dividend == INT_MIN else0 # 考虑被除数为 0 的情况 if dividend == 0: return0 # 一般情况,使用二分查找 # 将所有的正数取相反数,这样就只需要考虑一种情况 rev = False if dividend > 0: dividend = -dividend rev = not rev if divisor > 0: divisor = -divisor rev = not rev
# 快速乘 defquickAdd(y: int, z: int, x: int) -> bool: # x 和 y 是负数,z 是正数 # 需要判断 z * y >= x 是否成立 result, add = 0, y while z > 0: if (z & 1) == 1: # 需要保证 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 left, right, ans = 1, INT_MAX, 0 while left <= right: # 注意溢出,并且不能使用除法 mid = left + ((right - left) >> 1) check = quickAdd(divisor, mid, dividend) if check: ans = mid # 注意溢出 if mid == INT_MAX: break left = mid + 1 else: right = mid - 1
// 快速乘 // x 和 y 是负数,z 是正数 // 判断 z * y >= x 是否成立 funcquickAdd(y, z, x int)bool { for result, add := 0, y; z > 0; z >>= 1 { // 不能使用除法 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 } } returntrue }
funcdivide(dividend, divisor int)int { if dividend == math.MinInt32 { // 考虑被除数为最小值的情况 if divisor == 1 { return math.MinInt32 } if divisor == -1 { return math.MaxInt32 } } if divisor == math.MinInt32 { // 考虑除数为最小值的情况 if dividend == math.MinInt32 { return1 } return0 } if dividend == 0 { // 考虑被除数为 0 的情况 return0 }
ans := 0 left, right := 1, math.MaxInt32 for left <= right { mid := left + (right-left)>>1// 注意溢出,并且不能使用除法 if quickAdd(divisor, mid, dividend) { ans = mid if mid == math.MaxInt32 { // 注意溢出 break } left = mid + 1 } else { right = mid - 1 } } if rev { return -ans } return ans }
var divide = function(dividend, divisor) { constMAX_VALUE = 2 ** 31 - 1, MIN_VALUE = -(2 ** 31); // 考虑被除数为最小值的情况 if (dividend === MIN_VALUE) { if (divisor === 1) { returnMIN_VALUE; } if (divisor === -1) { returnMAX_VALUE; } } // 考虑除数为最小值的情况 if (divisor === MIN_VALUE) { return dividend === MIN_VALUE ? 1 : 0; } // 考虑被除数为 0 的情况 if (dividend === 0) { return0; } // 一般情况,使用二分查找 // 将所有的正数取相反数,这样就只需要考虑一种情况 let rev = false; if (dividend > 0) { dividend = -dividend; rev = !rev; } if (divisor > 0) { divisor = -divisor; rev = !rev; } let left = 1, right = MAX_VALUE, ans = 0; while (left <= right) { // 注意溢出,并且不能使用除法 const mid = left + ((right - left) >> 1); const check = quickAdd(divisor, mid, dividend); if (check) { ans = mid; // 注意溢出 if (mid === MAX_VALUE) { break; } left = mid + 1; } else { right = mid - 1; } }
return rev ? -ans : ans; }
// 快速乘 constquickAdd = (y, z, x) => { // x 和 y 是负数,z 是正数 // 需要判断 z * y >= x 是否成立 let 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; };
IList<int> candidates = new List<int>(); candidates.Add(divisor); int index = 0; // 注意溢出 while (candidates[index] >= dividend - candidates[index]) { candidates.Add(candidates[index] + candidates[index]); ++index; } int ans = 0; for (int i = candidates.Count - 1; i >= 0; --i) { if (candidates[i] >= dividend) { ans += 1 << i; dividend -= candidates[i]; } }
candidates := []int{divisor} for y := divisor; y >= dividend-y; { // 注意溢出 y += y candidates = append(candidates, y) }
ans := 0 for i := len(candidates) - 1; i >= 0; i-- { if candidates[i] >= dividend { ans |= 1 << i dividend -= candidates[i] } } if rev { return -ans } return ans }