自学内容网 自学内容网

力扣题目解析--两数相除

题目

给你两个整数,被除数 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 。

提示:

  • -231 <= dividend, divisor <= 231 - 1
  • divisor != 0

 代码展示

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (divisor == 0) {
            throw std::invalid_argument("Division by zero is undefined.");
        }
        if (dividend == INT_MIN && divisor == -1) {
            return INT_MAX;
        }
        int64_t ShangShu = static_cast<int64_t>(dividend) / divisor;
        if (ShangShu > INT_MAX) {
            return INT_MAX;
        } else if (ShangShu < INT_MIN) {
            return INT_MIN;
        }
        return static_cast<int>(ShangShu);
    }
};

代码的逐行解释

        if (divisor == 0) {
            throw std::invalid_argument("Division by zero is undefined.");
        }
  • 除以零检查:首先检查 divisor 是否为零。如果 divisor 是零,则抛出一个 std::invalid_argument 异常,并附带一条消息说明除以零是未定义的行为。这是为了防止程序执行到后续代码时出现运行时错误。
        if (dividend == INT_MIN && divisor == -1) {
            return INT_MAX;
        }
  • 溢出处理:特别处理当 dividend 是 INT_MIN(即 -2147483648)且 divisor 是 -1 的情况。这种情况下,理论上结果应该是 2147483648,但这个值超出了 int 类型的最大值 2147483647,因此会导致溢出。为了避免这种情况,直接返回 INT_MAX(即 2147483647),这是 int 类型的最大可能值。
        int64_t ShangShu = static_cast<int64_t>(dividend) / divisor;
  • 执行除法:将 dividend 转换为 int64_t 类型后进行除法运算,以确保中间计算不会溢出。int64_t 是 64 位有符号整数类型,可以容纳更大的数值范围。结果存储在 ShangShu 变量中。
        if (ShangShu > INT_MAX) {
            return INT_MAX;
        } else if (ShangShu < INT_MIN) {
            return INT_MIN;
        }
  • 结果范围检查:检查 ShangShu 是否超出了 int 类型的范围:
    • 如果 ShangShu 大于 INT_MAX(即 2147483647),则返回 INT_MAX
    • 如果 ShangShu 小于 INT_MIN(即 -2147483648),则返回 INT_MIN。 这样做的目的是确保最终返回的结果始终在 int 类型的有效范围内。
        return static_cast<int>(ShangShu);
    }
};
  • 返回结果:如果 ShangShu 在 int 类型的有效范围内,则将其转换回 int 类型并返回。这一步保证了返回值是一个有效的 int 类型。

原文地址:https://blog.csdn.net/wxtg1921/article/details/144703725

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!