题目
输入2个int型整数,它们进行除法计算并返回商,要求不得使用乘号’*‘、除号’/‘及求余符号’%'。当发生溢出时,返回最大的整数值。假设除数不为0。例如,输入15和2,输出15/2的结果,即7。
分析
下面以15/2为例讨论计算的过程。15大于2,也大于2的2倍(即4),还大于2的4倍(即8),但小于2的8倍(即16)。于是先将15减去8,还剩余7。由于减去的是除数的4倍,减去这部分对应的商是4。接下来对剩余的7和除数2进行比较,7大于2,大于2的2倍(即4),但小于2的4倍(即8),于是将7减去4,还剩余3。这一次减去的是除数2的2倍,对应的商是2。然后对剩余的3和除数2进行比较,3大于2,但小于2的2倍(即4),于是将3减去2,还剩余1。这一次减去的是除数的1倍,对应的商是1。最后剩余的数字是1,比除数小,不能再减去除数了。于是15/2的商是4+2+1,即7。
解
public class Test {public static void main(String[] args) {System.out.println(divide(15, 2));}public static int divide(int dividend, int divisor) {if (dividend == 0x80000000 && divisor == -1) {return Integer.MAX_VALUE;}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;}private static int divideCore(int dividend, int divisor) {int result = 0;while (dividend <= divisor) {int value = divisor;int quotient = 1;// 注意value和dividend都是负数while (value >= 0xc0000000 && dividend <= value + value) {quotient += quotient;value += value;}result += quotient;dividend -= value;}return result;}
}