0
点赞
收藏
分享

微信扫一扫

剑指 Offer II 001. 整数除法

耶也夜 2022-02-08 阅读 118

给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。

注意:

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1

示例 1:

输入:a = 15, b = 2
输出:7
解释:15/2 = truncate(7.5) = 7

示例 2:

输入:a = 7, b = -3
输出:-2
解释:7/-3 = truncate(-2.33333..) = -2

示例 3:

输入:a = 0, b = 1
输出:0

示例 4:

输入:a = 1, b = 1
输出:1

提示:

-231 <= a, b <= 231 - 1
b != 0

解法一:
完全使用位运算,自定义+,-操作,但是效率不高。
注意:leetcode的编辑器,如果int是负数,位运算左移会报错,出现这个东西,可以改用unsigned int:在这里插入图片描述

class Solution {
public:
    int add(int a, int b){
        while (b != 0) {
        int carry = (unsigned int)(a & b) << 1;
        a = a ^ b;
        b = carry;
    }
        return a;
    }
    int substract(int num1, int num2){
        return add(num1, add(~num2, 1));
    }
    int divide(int a, int b) {
        if(a==0)
            return 0;
        if((a==INT_MIN)&&(b==-1))
            return INT_MAX;
        int dividend = a > 0 ? a : add(~a, 1);
        int divisor = b > 0 ? b : add(~b, 1);
        int quotient = 0;
        for(int i = 31; i >= 0; i--) {
            if((dividend >> i) >= divisor) {
                quotient = add(quotient, 1 << i);
                dividend = substract(dividend, divisor << i);  
            }
        }
        if((a ^ b) < 0){
            quotient = add(~quotient, 1);
        }
        return quotient;
    }
};

在这里插入图片描述
解法二:
使用+,-符号,就快很多:

class Solution {
public:
    int divide(int a, int b) {
        if(a==0||b==1)
            return a;
        if((a==INT_MIN)&&(b==-1))
            return INT_MAX;
        else if(b==-1)
            return -a;
        unsigned int dividend =abs(a);
        unsigned int divisor =abs(b);
        int quotient = 0;
        for(int i = 31; i >= 0; i--) {
            if((dividend >> i) >= divisor) {
                quotient = quotient+(1 << i);
                dividend = dividend-(divisor << i);  
            }
        }
        if((a ^ b) < 0){
            quotient = -quotient;
        }
        return quotient;
    }
};

在这里插入图片描述
在提交之后,看到评论区有大佬的解答,写的很详细很棒,附上连接:
简单易懂Java/C++ /Python/js/go - 整数除法(剑指)

举报

相关推荐

0 条评论