题目大意:给定两个数字,求出它们的商,要求不能使用乘法、除法以及求余操做。shell
思路:说下用移位实现的方法ide
7/3=2,7是被除数,3是除数 除数左移,假设移动了n次后,移到最接近被除数,这时被除数=被除数-除数,商的一部分为2^n 若是被除数>除数,则继续循环 除数左移,又移动了m次后,移到最接近被除数,这时被除数=被除数-除数,商的一部分为2^m 最后商为2^n+2^m+...
Java实现:code
法1:若是能够用除法,一步就能够了ip
public int divide2(int dividend, int divisor) { // overflows if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; // 给定两个数字,求出它们的商,要求不能使用乘法、除法以及求余操做。 return dividend / divisor; }
法2:下面是用减法实现的,执行超时leetcode
public int divide2(int dividend, int divisor) { // overflows if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; int ans = 0; boolean negative = !((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)); dividend = Math.abs(dividend); divisor = Math.abs(divisor); dividend -= divisor; while (dividend >= 0) { ans++; dividend -= divisor; } return negative ? -ans : ans; }
法3:用移位实现get
public int divide(int dividend, int divisor) { // 防止溢出 if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; // 获取最终结果的符号 int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1; long dvd = Math.abs((long) dividend); long dvs = Math.abs((long) divisor); int ans = 0; while (dvd >= dvs) { long tmp = dvs, multiple = 1; while (dvd >= (tmp << 1)) { tmp <<= 1; multiple <<= 1; } dvd -= tmp; ans += multiple; } return sign == 1 ? ans : -ans; }