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 阅读(9) 评论(0) 编辑 收藏 举报