论坛首页 Java企业应用论坛

不用判断语句求俩数中的大(或者小)数

浏览 47950 次
精华帖 (0) :: 良好帖 (16) :: 新手帖 (3) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-12-13   最后修改:2009-12-13
直接使用(a-b)或者(a + b)都有可能溢出.

最简单的方法(只支持integer)避免溢出:

    int[] arr = {a, b};
    return arr[(int)((0L + a - b) >>> 63)];//转成long类型
0 请登录后投票
   发表时间:2009-12-14  
....这种题目无聊得很,你还可以开根号抓exception呢

try
{
Math.sqrt(a-b);
}
catch(Exception)
{
return b;
}
return a;
0 请登录后投票
   发表时间:2009-12-14   最后修改:2009-12-14
不能使用math下的方法(这个是楼主的规定)。

其实异常也是应该不允许的,因为它也是判断语句。(楼上的(a-b)可能会溢出哦)
0 请登录后投票
   发表时间:2009-12-14  
xiaoyu 写道
不能使用math下的方法(这个是楼主的规定)。

其实异常也是应该不允许的,因为它也是判断语句。

恩,这么一想,只有移位才是完全没有用判断
0 请登录后投票
   发表时间:2009-12-23  
看下我的解法行不行,我做了一些边界测试,没有问题
private static int max(int a,int b){
   
    //1 代表符号不同,0代表符号相同
    int xor = (a ^ b)>>>31;
   
    int[] ret = new int[2];
    int[] ab = {a,b};
   
    System.out.println("xor="+xor);
   
    ret[0] = ab[(a-b)>>>31];
   
    int sa = (a >>> 31) & 0x1;
    int sb = (b >>> 31) & 0x1;
   
    ret[1] = a*sb + b*sa;
   
    return ret[xor];
   
    }
0 请登录后投票
   发表时间:2010-01-04  
太厲害了,佩服啊,想了半天
0 请登录后投票
   发表时间:2010-01-09  
xiaoyu 写道
直接使用(a-b)或者(a + b)都有可能溢出.

最简单的方法(只支持integer)避免溢出:

    int[] arr = {a, b};
    return arr[(int)((0L + a - b) >>> 63)];//转成long类型


不能用Math,可以用Double吧? ^_^
public static double getMaxValue(double a, double b) {
	double[] arr = { a, b };
	return arr[(int) (Double.doubleToLongBits(a - b) >>> 63)];
}

0 请登录后投票
   发表时间:2010-03-22  
wujiazhao88 写道

前段日子找工作期间,经常上网找面试题目做做。

忘了是哪家公司的题目,其中有这么一道题

说,不能使用boolean,if else等判断语句,要求求出两个数中的大数,

【add at 2009-12-10 15:33:52】另,不能用Math类

 

一开始想来想去没有思路,后来想想,程序中需要判断的不就是if-else等逻辑判断以及异常嘛。。。

既然不能用判断,那就只能用异常了。

所以思路是,构造一段代码,让他遇到两个数时,可以构造出异常。什么代码可以这么神奇呢?

呵呵,很简单,用数组的越界可以解决问题!

 

public static int getMaxValueWidthoutBoolean(int a,int b){
 int[] array=new int[a];
try{
//只要b比a大,数组越界,肯定会导致异常,否则b比a小
//所以在catch模块中返回b,非异常返回a即可
array[b]=0;
}catch(Exception ex){
return b;
}
return a;
}

 呵呵,没去查过别人的解法是咋样的,我觉得应该还有其他更好的解法,各位想一想,知道的告知在下,谢谢了!

 

如果是参数是负数怎么办?

0 请登录后投票
   发表时间:2010-03-22  
mercyblitz 写道
wujiazhao88 写道

前段日子找工作期间,经常上网找面试题目做做。

忘了是哪家公司的题目,其中有这么一道题

说,不能使用boolean,if else等判断语句,要求求出两个数中的大数,

【add at 2009-12-10 15:33:52】另,不能用Math类

 

一开始想来想去没有思路,后来想想,程序中需要判断的不就是if-else等逻辑判断以及异常嘛。。。

既然不能用判断,那就只能用异常了。

所以思路是,构造一段代码,让他遇到两个数时,可以构造出异常。什么代码可以这么神奇呢?

呵呵,很简单,用数组的越界可以解决问题!

 

public static int getMaxValueWidthoutBoolean(int a,int b){
 int[] array=new int[a];
try{
//只要b比a大,数组越界,肯定会导致异常,否则b比a小
//所以在catch模块中返回b,非异常返回a即可
array[b]=0;
}catch(Exception ex){
return b;
}
return a;
}

 呵呵,没去查过别人的解法是咋样的,我觉得应该还有其他更好的解法,各位想一想,知道的告知在下,谢谢了!

 

如果是参数是负数怎么办?

 

楼主可以改一下,为了防止数组过大或者负索引。

 

可以这样么做

 

try

{

 

 new int[a-b]

}

catch(...){

    return b;

}

return a;

0 请登录后投票
   发表时间:2010-05-26  
这个行不行

int result=a>b?a:b;
System.out.println("MAX"+result);
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics