Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Note:
Both dividend and divisor will be 32-bit signed integers.
The divisor will never be 0.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.
利用任何数都可以写成 2 的指数数相加
x = a*2^0 + b*2^1 + c*2^2 +….
我们通过左移,找到离被除数最大的2的指数位置,记录商,然后减去这个数,再找离剩余的被除数最大的2的指数位置,知道剩余被除数小于除数为止
class Solution {
public int divide(int dividend, int divisor) {
if(divisor==0||dividend==Integer.MIN_VALUE&&divisor==-1) return Integer.MAX_VALUE;
int res=0;
int sign=(dividend<0)^(divisor<0)?-1:1;//^ 异或符号
long dvd=Math.abs((long)dividend);
long dvs=Math.abs((long)divisor);
while(dvs<=dvd){//注意使用long
long temp=dvs,mul=1;//mul 用来记录离被除数最大的2的指数前面的商
while(dvd>=temp<<1){
temp<<=1;mul<<=1;
}
System.out.println(mul);
dvd-=temp;res+=mul;
}
return sign==1?res:-res;
}
}
Leetcode submission sample
https://leetcode.com/problems/divide-two-integers