Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

如果可以用乘的话,二分搜索倒是不错的解法。
否则,只能寄希望于位符操作了。

 基本思想就是把除数向左移位(×2)然后与被除数比较,直到发现仅次于被除数的那个值,减去该值后继续。也可以用递归做,这里图省事,就是一个循环了事。

 1 public class Solution {

 2     public int divide(int dividend, int divisor) {

 3         // Note: The Solution object is instantiated only once and is reused by each test case.

 4         //return dividend / divisor;

 5         if(divisor == 1) return dividend;

 6         if(divisor == -1) return -dividend;

 7         if(dividend == 0) return 0;

 8         int sig = -1;

 9         if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))

10             sig = 1;

11         long idividend = Math.abs((long)dividend);

12         long idivisor = Math.abs((long)divisor);

13         int result = 0;

14         while (idividend >= idivisor) {

15             long d = idivisor;

16             int temp = 1;

17             while (idividend >= d << 1) {

18                 d = d << 1;

19                 temp = temp << 1;

20             }

21             idividend -= d;

22             result += temp;

23         }

24         return result * sig;

25     }

26 }

 做这一题的时候 要回归到除法的定义去:

(3)二进制数的乘法


  二进制数乘法过程可仿照十进制数乘法进行。但由于二进制数只有0或1两种可能的乘数位,导致二进制乘法更为简单。二进制数乘法的法则为:


0×0=0
0×1=1×0=0
1×1=1


  例如:1001和1010相乘的过程如下:


Divide Two Integers


  由低位到高位,用乘数的每一位去乘被乘数,若乘数的某一位为1,则该次部分积为被乘数;若乘数的某一位为0,则该次部分积为0。某次部分积的最低位必须和本位乘数对齐,所有部分积相加的结果则为相乘得到的乘积。


(4)二进制数的除法


  二进制数除法与十进制数除法很类似。可先从被除数的最高位开始,将被除数(或中间余数)与除数相比较,若被除数(或中间余数)大于除数,则用被除数(或中间余数)减去除数,商为1,并得相减之后的中间余数,否则商为0。再将被除数的下一位移下补充到中间余数的末位,重复以上过程,就可得到所要求的各位商数和最终的余数。


例如:100110÷110的过程如下:


Divide Two Integers


所以,100110÷110=110余10。

 当然也可以用10进制的来做。

 

 1 public class Solution {

 2     public int divide(int dividend, int divisor) {

 3         // Note: The Solution object is instantiated only once and is reused by each test case.

 4         int o=1;

 5         long a = dividend; 

 6         long b = divisor;

 7         if(dividend < 0){

 8             o ^= 1;

 9             a = -a;

10         }

11         if(b < 0){

12             o ^= 1;

13             b = -b;

14         }

15         long result = 0, bit = 0;

16         for(long i = a; i > b; i >>= 1){

17             bit ++;

18         }

19         

20         while(a >= b){

21             if(a >= (b << bit)){

22                 a -= b << bit;

23                 result |= 1 << bit;

24             }

25             bit --;

26         }

27         if(o == 1) return (int)result;

28         else return (int)(-result);

29     }

30 }

这题有两个地方比较麻烦:

一个是要转换成long 进行运算。 以防符号位的影响。

在一个就是首先就要转成long 后面都只能用long 来运算,如果看负数的时候使用int 就会出错。

 

 

第三遍:

test case:

1. dividend & divisor can be negtive.

2. handle divisor == 1

 

你可能感兴趣的:(Integer)