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