theme: channing-cyan
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
一、题目描述:
给定两个整数 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) 链接:leetcode-cn.com/problems/xo…
二、思路分析:
此题要求的是两个整数的除法的商,并且要求不得使用*、/、%符号,那么能够想到的办法就是位运算了,除法,那就是右移了,右移一位相当于除以2。具体过程如下:
设置一个变量,用来记录正数个数,以便在最后的结果调整正负号。
特殊情况,可能溢出的情况讨论,由于是整数除法,除数不为0,商的值一定小于等于被除数的绝对值,因此,int型溢出只有一种情况,(-2^31)/(-1) = 2^31。
举例说明
17除以2,17 大于 2,也大于 4 (2 * 2 ^ (1)),也大于 8 (2 * 2 ^ (2)),也大于 16 (2 * 2 ^ (3)),但是小于 32 (2 * 2 ^ (4)),于是将 17 - 16 得到 1,并记录此时的答案 8,剩下的被除数 1,已经小于 2,最终结果为 8 + 1 = 9。
三、AC 代码:
class Solution {
public int divide(int dividend, int divisor) {
if(dividend == 0x80000000 && divisor == -1){
return 0x7FFFFFFF;
}
int negative = 2;
if(dividend > 0){
negative --;
dividend = -dividend;
}
if(divisor > 0){
negative --;
divisor = -divisor;
}
int result = 0;
while(dividend <= divisor){
dividend -= divisor;
result++;
}
return negative == 1 ? -result : result;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐