给定两个整数 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 - 整数除法(剑指)