初逛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);
}
}
昨日见一贴“如何求两个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);
}
}
http://blog.csdn.net/justinavril/archive/2009/04/29/4138182.aspx
其实要想在整数范围防止溢出,可以先转换成long形,然后套公式比较。
所谓不用API来实现的意思,说的是不用API进行较大数的求解。
return a>=b?a:b;
最实用
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
其实那么多办法只是 面试的时候可能用到,你平时写代码 肯定 还是 用 a>b ? a : b 额这个问题 意义不大
只是 换1个角度思考问题而已
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);
}
}