29
public class Divide {
static final int MAX = Integer.MAX_VALUE;
static final int MIN = Integer.MIN_VALUE;
public int divide(int dividend, int divisor) {
// 溢出的情况
if (dividend == MIN && divisor == -1) {
return MAX;
}
// 记录符号位
int sign = -1;
if ((dividend > 0 && divisor >0) || (dividend < 0 && divisor < 0)) {
sign = 1;
}
// 全部转换成负数 防止溢出 因为负数比正数范围更大 -128 - 127
dividend = dividend > 0 ? -dividend : dividend;
divisor = divisor > 0 ? -divisor : divisor;
int ans = 0;
// 都是负数的时候 比较正好相反
while (dividend <= divisor) {
// 每次递增的数
int temp = divisor, count = 1;
// 除完有余数 说明最少是2倍大小
while (temp >= dividend - temp) {
temp += temp; // 每次需要多减去一个除数
count += count; // 商累加
}
dividend -= temp; // 每次需要多减去一个除数
ans += count; // 计算商
}
return sign < 0 ? -ans : ans;
}
}
自己模仿别人写的倍增法
class Solution {
public int divide(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) {
return 0;
}
long ans = 0;
int sign = ((dividend ^ divisor) >> 31 & 1) == 1 ? -1 : 1;
long dividendLong = Math.abs((long)dividend);
long divisorLong = Math.abs((long)divisor);
while(dividendLong >= divisorLong) {
long ansTmp = 1;
long tmp = divisorLong;
while(dividendLong >= tmp) {
dividendLong -= tmp;
ans += ansTmp;
ansTmp = ansTmp << 1;
tmp = tmp << 1;
}
}
return (int)ans * sign;
}
}
class Solution {
public int divide(int dividend, int divisor) {
if(dividend==0) return 0;
if(dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
//使用异或判断结果的正负号
boolean negative=(dividend ^ divisor)<0;
int res=0;
//转换为正数
long div=Math.abs((long) dividend),divs=Math.abs((long) divisor);
while(div >= divs) {
int sum = 0;
int cnt = 1;
long target = divs;
while(div >= target) {
div -= target;
target = 2 * target;
sum += cnt;
cnt = cnt * 2;
}
res += sum;
}
return negative?-res:res;
}
}
posted on 2023-09-17 16:32 zhouzhou0615 阅读(24) 评论(0) 收藏 举报
浙公网安备 33010602011771号