1.题目
给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。见原题
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31−1]。本题中,如果除法结果溢出,则返回 2^31 − 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
2. 解题
如果被除数大于或等于除数,则进行如下循环,定义变量t等于除数,定义计数p,当t的两倍小于等于被除数时,进行如下循环,t扩大一倍,p扩大一倍,然后更新 res 和m。
class Solution {
public:
int divide(int dividend, int divisor) {
if (dividend == INT_MIN && divisor == -1)
return INT_MAX;
long m = labs(dividend), n = labs(divisor);
long sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
if (n == 1)
return sign == 1 ? m : -m;
int res = 0;
while (m >= n)
{
long t = n;
long p = 1;
while (m >= (t << 1))
{
t <<= 1;
p <<= 1;
}
m -= t;
res += p;
}
return sign == 1 ? res : -res;
}
};