首页 > Java开发 > JAVA完成整数除法运算

JAVA完成整数除法运算

题目原型:

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

思路一:

采用最普通的方式,累减法。

注意:为防止溢出,我们另外设置两个变量存储被除数和除数。

 

[java] view plaincopy

  1. public int divide(int dividend, int divisor)
  2.     {
  3.         //处理符号
  4.         if(dividend==0)
  5.             return 0;
  6.         int sign = 1;
  7.         if(dividend<0)
  8.             sign = sign * (-1);
  9.         if(divisor<0)
  10.             sign = sign * (-1);
  11.         long dividendtemp = Math.abs(dividend);
  12.         long divisortemp =  Math.abs(divisor);
  13.         if(divisortemp==1)
  14.             return (int)(sign*dividendtemp);
  15.         int result = 0;
  16.         long sum = divisortemp;
  17.         if(dividendtemp>=divisortemp)
  18.         {
  19.             while(sum<dividendtemp)
  20.             {
  21.                 result++;
  22.                 sum+=divisortemp;
  23.             }
  24.         }
  25.         return sign*result;
  26.     }

思路二:

 

基于思路一过于“笨”,当处理被除数很大而除数很小时反应很慢,下面改进一下,即采用移位运算:

 

[java] view plaincopy

  1. public int divide(int dividend, int divisor)
  2.     {
  3.         //处理符号
  4.         if(dividend==0)
  5.             return 0;
  6.         int sign = 1;
  7.         if(dividend<0)
  8.             sign = sign * (-1);
  9.         if(divisor<0)
  10.             sign = sign * (-1);
  11.         //防止溢出
  12.         long dividendtemp = Math.abs(dividend);
  13.         long divisortemp =  Math.abs(divisor);
  14.         if(divisortemp==1)
  15.             return (int)(sign*dividendtemp);
  16.         int result = 0;
  17.         int threshold = 0;
  18.         while((divisortemp<<threshold)<=dividendtemp)
  19.         {
  20.             threshold++;
  21.         }
  22.         threshold--;
  23.         for(int i = threshold;i>=0;i--)
  24.         {
  25.             if((divisortemp<<i)<=dividendtemp)
  26.             {
  27.                 result+=(1<<i);
  28.                 dividendtemp-=divisortemp;
  29.             }
  30.         }
  31.         return sign*result;
  32.     }

 


本文固定链接: http://www.devba.com/index.php/archives/4316.html | 开发吧

报歉!评论已关闭.