leetcode-两数相除
2024-01-23 本文已影响0人
ButICare_b72d
https://leetcode.cn/problems/divide-two-integers/
给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate)其小数部分。
例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。
返回被除数 dividend 除以除数 divisor 得到的 商 。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1] 。
本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。
代码
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
if (divisor == 1) {
return dividend;
}
if (divisor == -1) {
return dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE : -dividend;
}
boolean isSame = (dividend < 0 && divisor < 0) || (dividend > 0 && divisor > 0);
//取绝对值进行计算,无需判断谁正谁负
long dividendLong = dividend > 0 ? dividend : dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE+1L : -dividend;
long divisorLong = divisor > 0 ? divisor : divisor == Integer.MIN_VALUE ? Integer.MAX_VALUE+1L : -divisor;
long count = 0;
while (dividendLong >= divisorLong) {
//每次翻倍-,超过重头开始
long temp = divisorLong;
long tempCount = 1;
while (true) {
if (dividendLong < temp) {
break;
}
tempCount += tempCount;
dividendLong -= temp;
temp += temp;
}
//-1是由于每次满足条件都会多加第一次的1
count += tempCount - 1;
}
return (int) (isSame ? count : -count);
}
}