给定两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend
除以除数 divisor
得到的商。
示例 1:
输入: dividend = 10, divisor = 3 输出: 3
示例 2:
输入: dividend = 7, divisor = -3 输出: -2
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
-
package divideTwoIntegers; public class DivideTwoIntegers { public static void main(String[] args) { DivideTwoIntegers divideTwoIntegers = new DivideTwoIntegers(); Solution solution = divideTwoIntegers.new Solution(); System.out.println(solution.divide(-1, 1)); } class Solution { public int divide(int dividend, int divisor) { //判断除数是否为0,为0则结果是极大值 if(divisor==0) { return Integer.MAX_VALUE; } //判断结果是否是负数 boolean isNegative = false; if((dividend>0&&divisor<0)||(dividend<0&&divisor>0)) { isNegative = true; } long dividendLong = Math.abs((long)dividend); long divisorLong =Math.abs((long)divisor); if(dividend==0||dividendLong<divisorLong) { return 0; } long result =dichotomyDividend(dividendLong,divisorLong); if(result>Integer.MAX_VALUE) { return isNegative?Integer.MIN_VALUE:Integer.MAX_VALUE; } return isNegative?(int)-result:(int)result; } private long dichotomyDividend(long dividendLong, long divisorLong) { // TODO Auto-generated method stub if(dividendLong<divisorLong) { return 0; } //首次取1值 long result=1; long tempDivisor = divisorLong; //进行二分减少计算 while(dividendLong>=(tempDivisor+tempDivisor)) { tempDivisor+=tempDivisor; result+=result; } return result+dichotomyDividend(dividendLong-tempDivisor, divisorLong); } } }