锁定老帖子 主题:不用判断语句求俩数中的大(或者小)数
精华帖 (0) :: 良好帖 (16) :: 新手帖 (3) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-30
private static int Max(int a, int b) { int[] s = new int[] { a, b }; int c = a-b; int index = (c >> 31) & 0x0001; return s[index]; } 以上代码同样适用于C#,在C#里还不支持">>>"这样的语法。 我最初也是这么想的,但直到我发现有朋友这样实现: int max = a - ((a - b) & ((a - b) >> 31)); 我立刻知道自己的差距了,我最初甚至怀疑这段代码的准确性。它是如何实现的呢,那位朋友没有明说,我就来试着说一哈,如果说的不好,别拍我。 1,首先任何正整数(包括0)右移31位都等于0;而负整数右移31位都等于 -1;(这个估计大家都知道) 2,如果a大于b,这样由于0和任何数进行&操作都等于0, 所以可以得到最大值a; 3,如果b大于a呢? 这才是最关键的,才是核心,所以大家只要记住任何值和-1进行&操作都等于它本身就已经明白了;这个时候等式就变成 max=a-(a-b),最后最大值等于b. 还有那些位操作,我们应该记住呢,还记得那个:不用第三个变量交换两个数的题吗?是的,还应该记住,任何值与其本身异或等于0;而与0异或等于它本身。 int a; a^a==0 //true a^0==a //true a==a^a^a //这个很有趣 |
|
返回顶楼 | |
发表时间:2010-05-31
最后修改:2010-05-31
跳大神也是一种艺术:
public class MaxMin { static int max = 0 ; public static void main(String[] args) throws InterruptedException { MaxMin m = new MaxMin(); int a = m.max(9, 10); System.out.println("最大:"+a); } public int max(int a , int b ) throws InterruptedException{ new MyThread(a,this).start(); new MyThread(b,this).start(); Thread.sleep((a+b)); return this.max; } } class MyThread extends Thread{ public int f = 0; public MaxMin max ; MyThread(int f , MaxMin max){ this.f=f; this.max = max; } public void run() { try {sleep(f);} catch (Exception e) {} max.max = f; } } |
|
返回顶楼 | |
发表时间:2010-07-16
http://liaofan2009.iteye.com/blog/552593
(a+b+Math.abs(a-b))/2 |
|
返回顶楼 | |
发表时间:2010-07-16
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-07-16
试试用hashset保存这两个数
Set set=new HashSet(); set.add(5); set.add(9); 大的数在hashset中的前面 |
|
返回顶楼 | |
发表时间:2010-07-18
return (int)( a*( (0L+b-a)>>>63 ) + b*( (0L+a-b)>>>63 ) )
|
|
返回顶楼 | |
发表时间:2010-07-18
用位运算吧
public int getMax(int a,int b){ int[] num={a,b}; return int[(a-b)>>>31]; } |
|
返回顶楼 | |
发表时间:2010-07-19
superxielei 写道 int getMaxNum(int a,int b){
double x = (double)a; double y = (double)b; return (int)(x/2+y/2+Math.abs(x/2-y/2)); } 不能用Math类 |
|
返回顶楼 | |
发表时间:2010-07-19
Jack-chen 写道 http://liaofan2009.iteye.com/blog/552593
(a+b+Math.abs(a-b))/2 不能用Math类 |
|
返回顶楼 | |
发表时间:2010-07-19
severusz 写道 superxielei 写道 int getMaxNum(int a,int b){
double x = (double)a; double y = (double)b; return (int)(x/2+y/2+Math.abs(x/2-y/2)); } 双手赞成,想当年老师也是这么讲的! 不能用Math类,看来好多童鞋没有看清题目,就在做了啊! |
|
返回顶楼 | |