题目
给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。
注意:
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31−1]。本题中,如果除法结果溢出,则返回 2^31 − 1
题解
由于不能用乘除法,因此考虑使用加减法/位运算,关键在于越界条件的判断与复杂度降低
int divide(int a, int b) {
// 考虑用加减/位运算计算
if(a == INT_MIN && b == -1)
return INT_MAX;
int res = 0;
// 除数如果为INT_MIN,结果必为0/1
if(b == INT_MIN)
return a == b ? 1 : 0;
// 被除数为INT_MIN
if(a == INT_MIN)
{
a += abs(b);
res++;
}
// 判断a,b是否同号
int sign = (a > 0) ^ (b > 0) ? -1 : 1;
int u_a = abs(a);
int u_b = abs(b);
for(int i = 31; i >= 0; --i)
{
if((u_a >> i) >= u_b)
{
u_a = u_a - (u_b << i);
if(res > INT_MAX - (1 << i)) //结果溢出,返回INT_MIN
return INT_MIN;
res += 1 << i;
}
}
return sign == 1 ? res : -res;
}