锁定老帖子 主题:不用判断语句求俩数中的大(或者小)数
精华帖 (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类型 |
|
返回顶楼 | |
发表时间:2009-12-14
....这种题目无聊得很,你还可以开根号抓exception呢
try { Math.sqrt(a-b); } catch(Exception) { return b; } return a; |
|
返回顶楼 | |
发表时间:2009-12-14
最后修改:2009-12-14
不能使用math下的方法(这个是楼主的规定)。
其实异常也是应该不允许的,因为它也是判断语句。(楼上的(a-b)可能会溢出哦) |
|
返回顶楼 | |
发表时间:2009-12-14
xiaoyu 写道 不能使用math下的方法(这个是楼主的规定)。
其实异常也是应该不允许的,因为它也是判断语句。 恩,这么一想,只有移位才是完全没有用判断 |
|
返回顶楼 | |
发表时间: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]; } |
|
返回顶楼 | |
发表时间:2010-01-04
太厲害了,佩服啊,想了半天
|
|
返回顶楼 | |
发表时间: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)]; } |
|
返回顶楼 | |
发表时间: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; } 呵呵,没去查过别人的解法是咋样的,我觉得应该还有其他更好的解法,各位想一想,知道的告知在下,谢谢了!
如果是参数是负数怎么办? |
|
返回顶楼 | |
发表时间: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; |
|
返回顶楼 | |
发表时间:2010-05-26
这个行不行
int result=a>b?a:b; System.out.println("MAX"+result); |
|
返回顶楼 | |