算法——两数快速相除求整数部分

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335)
= -2
leetcode

解题思路:

  • 因为这里只需要求整数部分,首先能够想到的是拿除数去循环减被除数,能减多少个还是非负数,答案就是多少,这样的效率很低,如果被除数特别大,除数特别小,就会导致超时。
  • 这里可以用到快速幂的思想,因为答案是一个32位的整型,所以,从最高位开始枚举,第i位对应的值就是num << i,如果被除数大于该值,则减,表示除去了相应个数的除数,同时答案增加该位的数值1 << i
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 isMin = false;
        if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0) isMin = true;
        long nd = Math.abs((long) dividend);
        long ns = Math.abs((long) divisor);

        int res = 0;
        // 从高位开始枚举,每一位是否可以减去答案
        for(int i = 31; i >= 0; i--) {
        	// 判断该位是否存在数值
            if((ns << i) <= nd) {
                res += 1 << i;
                nd -= ns << i;
            }
        }

        return isMin ? -res : res;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值