面试题1:整数除法(Java版)

题目:输入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;
}

你可能感兴趣的:(剑指office(Java版),算法,数据结构)