题目:输入2个int型整数,它们进行除法计算并返回商,要求不得使用乘号’*‘、除号’/‘及求余符号’%'。当发生溢出时,返回最大的整数值。假设除数不为0。例如,输入15和2,输出15/2的结果,即7。
/**
* 返回整数除法结果
* @param dividend 被除数
* @param divisor 除数
* @return 整数除法结果
*/
public int divide(int dividend, int divisor) {
if (dividend == 0x80000000 && divisor == -1) {
return Integer.MAX_VALUE;
}
//negative为除数和被除数中负数符号的
// 个数为1时表示为负数,为0或者2是表示为正数
int negative = 2;
//将除数和被除数转化为负数形式,因为负数形式表示的数
// 始终比正数形式表示的数多一个
if (dividend > 0) {
negative--;
dividend = -dividend;
}
if (divisor > 0) {
negative--;
divisor = -divisor;
}
//计算出两个负整数相除的结果
int result = divideCore(dividend, divisor);
return negative == 1 ? -result : result;
}
/**
* 计算两个负整数相除的结果
* @param dividend 被除数
* @param divisor 除数
* @return 两个负整数相除的结果
*/
private int divideCore(int dividend, int divisor) {
int result = 0;
// 当负被除数小于负除数时循环执行除法操作
while (dividend <= divisor) {
// 在本次循环中除数的值
int value = divisor;
// 初始化商的值为1(因为当负被除数小于负除数时商至少为1)
int quotient = 1;
// 当负除数大于最小负数的一半
// 并且负被除数小于负除数的两倍时进入循环
while (value >= 0xc0000000 && dividend <= value + value) {
// 商为当前商的两倍
quotient += quotient;
// 除数也为当前的两倍
value += value;
}
// 加上在本次循环中的商
result += quotient;
// 减去已经被除去的值
dividend -= value;
}
return result;
}