论坛首页 Java企业应用论坛

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

浏览 47984 次
精华帖 (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  //这个很有趣

0 请登录后投票
   发表时间: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;
	}
}
0 请登录后投票
   发表时间:2010-07-16  
http://liaofan2009.iteye.com/blog/552593

(a+b+Math.abs(a-b))/2
0 请登录后投票
   发表时间: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;
}

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

适合负数吗?

0 请登录后投票
   发表时间:2010-07-16  
试试用hashset保存这两个数
Set set=new HashSet();
        set.add(5);
        set.add(9);
大的数在hashset中的前面
0 请登录后投票
   发表时间:2010-07-18  
return (int)( a*( (0L+b-a)>>>63 ) + b*( (0L+a-b)>>>63 ) )
0 请登录后投票
   发表时间:2010-07-18  
用位运算吧
public int getMax(int a,int b){
  int[] num={a,b};
  return int[(a-b)>>>31];
}
0 请登录后投票
   发表时间: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类
0 请登录后投票
   发表时间:2010-07-19  
Jack-chen 写道
http://liaofan2009.iteye.com/blog/552593

(a+b+Math.abs(a-b))/2

不能用Math类
0 请登录后投票
   发表时间: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类,看来好多童鞋没有看清题目,就在做了啊!
0 请登录后投票
论坛首页 Java企业应用版

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