初逛CSDN论坛,便喜欢上了。
    昨日见一贴“如何求两个int型的最大值”:
    要求不使用任何判断语句和API求两个整型数的较大值。
    各位道友各抒已见,发表了很多观点和相应的算法。可惜的是经过测试各种算法总有些不尽人意之处。
    现取部分算法如下:
    (道友们算法很多,不合贴子要求的就不讨论了)
int max=x*(1-((x-y)>>>31))+y*((x-y)>>>31);    初看上去,似乎没有任何问题,但若取x=-2147483648;y=2147483647;或任何可使x-y越界的数据时该算法法就出错了。
int max(int a, int b) 
        { 
            return  (a+b+abs(a-b))/2; 
        } 
    还是越界问题。
int max(int a, int b) 
        { 
            return  (a * (a / b) + b * (b / a)) / ((a / b) + (b / a)); 
        }     此方法不会造成越界,且考虑了a=b;的情况。但是除未考虑分母不分0之外。若a或b或ab时同为负呢?因为-3/-2=1,-2/-3=0。
    
    贫道不才,窃取各位道友算法的精妙处,得出如下算法。经初步测试通过,还望各位道友考验、指正。public class getMAX{
public static void main(String[] args)
    {
int x=0,y=0;
/* 经过以下几组数据测试通过:请删除下列任意一组注释或自拟数据进行测试 */


// x=-2147483648 ;y=2147483647;
// x=-2147483648 ;y=-2147483647;
// x=2147483647 ;y=2147483647;
// x=100 ;y=0;
// x=100 ;y=-100;

int a=1-((x/2-y/2)>>>31);  //x/2大于或等于y/2时为1,否则为0
int b=1/(Math.abs(x/2-y/2)+1); //x/2等于y/2时为1,否则为0
int c=x%2; //x/2的余数
int d=y%2; //y/2的余数

  int max =x*(a-(1-c)*b)+y*(1-(a-(1-c)*b));
 
     System.out.println("a="+a+";b="+b+";c="+c+";d="+d+";MAX="+max);
    }
}

解决方案 »

  1.   

    这个题目应该是要求不用比较运算符 不用Java API来实现的。其实只要用移位运算符就行了
      

  2.   

    看我的这篇blog吧:重载,集成和多态;算符优先级;没事儿找事儿 
      

  3.   

    你没仔细看吧  我的那个帖子只是索引 关于这个问题 我之前就已经发过了blog:
    http://blog.csdn.net/justinavril/archive/2009/04/29/4138182.aspx
      

  4.   

    Math.abs是api吧。
    其实要想在整数范围防止溢出,可以先转换成long形,然后套公式比较。
      

  5.   

    恩,您这篇blog的算法是可以的,但问题不一样咯。一个是比较大小,另一个是求较在值。呵呵……您知道其它的能求较大值的算法么?
      

  6.   


    所谓不用API来实现的意思,说的是不用API进行较大数的求解。
      

  7.   

    还是感觉
     return a>=b?a:b;
    最实用
      

  8.   

    求较大值 你可以把数组里的那个a>=b换成a,a<b换成b啊  这样不就好了
      

  9.   

    解决整数范围判断问题:public class getMAX{
    public static void main(String[] args) throws UnsupportedEncodingException {  int x=Integer.MAX_VALUE;
     int y=Integer.MIN_VALUE;

     int z = x-(x-y)*(x-y>>>31);
     System.out.println(z);
     
     System.out.println("-------------");
     
     long a = x;
     long b = y;
     
     int t = (int)(a-(a-b)*(a-b>>>63));  
     System.out.println(t); }
    }output:-2147483648
    -------------
    2147483647
      

  10.   

    code=Java]return a>=b?a:b;[[/code]
      

  11.   


    其实那么多办法只是 面试的时候可能用到,你平时写代码 肯定 还是 用 a>b ? a : b 额这个问题 意义不大
    只是 换1个角度思考问题而已
      

  12.   

    如果说Math.abs(x/2-y/2)用了API的话,也可以换一种方式求绝对值:如要求a的绝对值,可以用表达式 a=a*(a>>>31*(-2)+1);a>>>31是得出a的符号。*(-2)+1 则是把 0 变为 1 ,把 1 变为 -1 。也就是若a 为正 则 a=a*1  ,若a 为负则 a=a*(-1)
      

  13.   


    public class getMAX{
        public static void main(String[] args)
        {
            int x=0,y=0;        
        /* 经过以下几组数据测试通过:请删除下列任意一组注释或自拟数据进行测试 */
            
            
        //    x=-2147483648 ;y=2147483647;
        //    x=-2147483648 ;y=-2147483647;
        //    x=2147483647 ;y=2147483647;
        //    x=100 ;y=0;
        //    x=100 ;y=-100;
            
            int a=1-((x/2-y/2)>>>31);                //x/2大于或等于y/2时为1,否则为0
            int b=(x/2-y/2)*((x/2-y/2)>>>31*(-2)+1); //x/2等于y/2时为1,否则为0
            int c=x%2;                               //x/2的余数
             int d=y%2;                               //y/2的余数
            
             int max =x*(a-(1-c)*b)+y*(1-(a-(1-c)*b));
             
            System.out.println("a="+a+";b="+b+";c="+c+";d="+d+";MAX="+max);
        }
    }