`
wujiazhao88
  • 浏览: 11363 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

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

说,不能使用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;
}

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

分享到:
评论
103 楼 Jack-chen 2010-07-16  
http://liaofan2009.iteye.com/blog/552593

(a+b+Math.abs(a-b))/2
102 楼 抛出异常的爱 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;
	}
}
101 楼 hellolaojiang 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  //这个很有趣

100 楼 ahy608 2010-05-26  
这个行不行

int result=a>b?a:b;
System.out.println("MAX"+result);
99 楼 mercyblitz 2010-03-22  
<div class="quote_title">mercyblitz 写道</div>
<div class="quote_div">
<div class="quote_title">wujiazhao88 写道</div>
<div class="quote_div">
<p>前段日子找工作期间,经常上网找面试题目做做。</p>
<p>忘了是哪家公司的题目,其中有这么一道题</p>
<p>说,不能使用boolean,if else等判断语句,要求求出两个数中的大数,</p>
<p>【add at 2009-12-10 15:33:52】另,不能用Math类</p>
<p> </p>
<p>一开始想来想去没有思路,后来想想,程序中需要判断的不就是if-else等逻辑判断以及异常嘛。。。</p>
<p>既然不能用判断,那就只能用异常了。</p>
<p>所以思路是,构造一段代码,让他遇到两个数时,可以构造出异常。什么代码可以这么神奇呢?</p>
<p>呵呵,很简单,用数组的越界可以解决问题!</p>
<p> </p>
<pre name="code" class="java">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;
}</pre>
<p> 呵呵,没去查过别人的解法是咋样的,我觉得应该还有其他更好的解法,各位想一想,知道的告知在下,谢谢了!</p>
</div>
<p> </p>
<p>如果是参数是负数怎么办?</p>
</div>
<p> </p>
<p>楼主可以改一下,为了防止数组过大或者负索引。</p>
<p> </p>
<p>可以这样么做</p>
<p> </p>
<p>try</p>
<p>{</p>
<p> </p>
<p> new int[a-b]</p>
<p>}</p>
<p>catch(...){</p>
<p>    return b;</p>
<p>}</p>
<p>return a;</p>
98 楼 mercyblitz 2010-03-22  
<div class="quote_title">wujiazhao88 写道</div>
<div class="quote_div">
<p>前段日子找工作期间,经常上网找面试题目做做。</p>
<p>忘了是哪家公司的题目,其中有这么一道题</p>
<p>说,不能使用boolean,if else等判断语句,要求求出两个数中的大数,</p>
<p>【add at 2009-12-10 15:33:52】另,不能用Math类</p>
<p> </p>
<p>一开始想来想去没有思路,后来想想,程序中需要判断的不就是if-else等逻辑判断以及异常嘛。。。</p>
<p>既然不能用判断,那就只能用异常了。</p>
<p>所以思路是,构造一段代码,让他遇到两个数时,可以构造出异常。什么代码可以这么神奇呢?</p>
<p>呵呵,很简单,用数组的越界可以解决问题!</p>
<p> </p>
<pre name="code" class="java">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;
}</pre>
<p> 呵呵,没去查过别人的解法是咋样的,我觉得应该还有其他更好的解法,各位想一想,知道的告知在下,谢谢了!</p>
</div>
<p> </p>
<p>如果是参数是负数怎么办?</p>
97 楼 langshao 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)];
}

96 楼 yfnok 2010-01-04  
太厲害了,佩服啊,想了半天
95 楼 liuwanzhen_ren 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];
   
    }
94 楼 wujiazhao88 2009-12-14  
xiaoyu 写道
不能使用math下的方法(这个是楼主的规定)。

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

恩,这么一想,只有移位才是完全没有用判断
93 楼 xiaoyu 2009-12-14  
不能使用math下的方法(这个是楼主的规定)。

其实异常也是应该不允许的,因为它也是判断语句。(楼上的(a-b)可能会溢出哦)
92 楼 ray_linn 2009-12-14  
....这种题目无聊得很,你还可以开根号抓exception呢

try
{
Math.sqrt(a-b);
}
catch(Exception)
{
return b;
}
return a;
91 楼 xiaoyu 2009-12-13  
直接使用(a-b)或者(a + b)都有可能溢出.

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

    int[] arr = {a, b};
    return arr[(int)((0L + a - b) >>> 63)];//转成long类型
90 楼 elmar 2009-12-12  
这个明显是考位运算啊
int a, b; //a,b是待求的数
int sa = (a-b)>>31; //如果a>=b,则sa=0;否则sa=1;
int sb = (~sa)>>31; //sb=sa?0:1;
int max = sa*b+sb*a;
89 楼 ws00416122 2009-12-12  
       int i1=  1123;
       int i2 = 32;
       int i3 = i1 % i2;
       Response.Write(""+  (i1 - i3));
88 楼 severusz 2009-12-12  
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));
}


双手赞成,想当年老师也是这么讲的!
87 楼 wangdgsc 2009-12-12  
可以用三元表达式,语句是少,不过还是有判断
86 楼 mingkongeye 2009-12-11  
楼主的思维方式还是比较好的,虽然IT行业数学基础也挺重要的,但是我觉得思考问题的方式也重要。
这道题,我觉得是考思维方式,如果说要考数学基础的话,那这道题的答案就海量了。
85 楼 nolove_2007 2009-12-11  
完全是吃饱了撑的,工作的时候一定要记住,用最简单的方式来做事
84 楼 lee326 2009-12-11  
用三目允许吧?
int getBigNumber(int a,int b)
{
    return a>=b?a:b;
}

相关推荐

    37.java判断语句.zip

    37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java判断语句.zip37.java...

    MATLAB中的if判断语句.md

    ### MATLAB中的if判断语句详解 #### 一、引言 在编程中,条件判断是实现逻辑控制的基础之一。MATLAB作为一种广泛应用于科学计算、数据分析及算法开发的强大工具,提供了丰富的控制流语句来帮助用户根据不同的条件...

    转置矩阵的实现(无判断语句)

    4. **算法优化**:在某些情况下,避免if判断语句可以提高代码的执行效率,特别是在大规模计算中。 综上所述,无判断语句的矩阵转置实现方法利用了数组的索引特性,减少了程序的复杂性,提高了效率。这种技术在处理...

    判断语句.exe

    判断语句.exe

    Python基础教程-2.1python条件判断语句.pdf

    《Python基础教程-2.1python条件判断语句》这篇文档详细介绍了Python编程中的条件判断语句,这是控制程序流程的重要工具。条件语句允许程序员根据特定条件执行不同的代码块,以此实现更复杂的逻辑。 首先,文章介绍...

    MS SQL Server查询小数位数语句

    MS SQL Server查询语句,以小数位数作为条件,可查询符合条件的记录。可查询多位小数位数。

    例4.2,例4.2输入俩个实数按由小到大的顺序输出这俩个数,matlab源码.zip

    本示例“例4.2,例4.2输入俩个实数按由小到大的顺序输出这俩个数,matlab源码”旨在教授如何在MATLAB中接收用户输入的两个实数,并按照从小到大的顺序进行输出。以下是关于这个主题的详细解释: 首先,MATLAB中的`...

    判断密码必须包括大小写字母,特殊字符,数字,长度8到16位

    本文将围绕“判断密码必须包括大小写字母、特殊字符、数字且长度限制在8到16位之间”这一需求展开,详细介绍如何通过编程实现这一功能,并分析其中涉及的关键技术点。 #### 二、密码复杂度要求 根据题目描述,一个...

    判断语句 三目运算符代码

    判断语句 三目运算符代码

    Python学习第二课 if判断语句

    01_判断年龄.py 02_判断年龄改进.py 03_逻辑运算演练.py 04_逻辑运算符演练2.py 05_逻辑运算符演练3.py 06_女朋友的节日.py 07_火车站安检.py 08_石头剪刀布.py

    C#if判断语句。。。。。

    cvnbc天人合一突然发话更符合规范 提供方花费花费花费

    求100之内自然数中最大的能被17整除的数.doc

    在这个程序中,我们使用了for循环来遍历100之内的自然数,并使用if语句来判断当前数是否能被17整除。如果能被整除,我们就break循环,并输出当前数。 知识点:for循环、if语句、break语句、模运算符(%) 2. a,b,c...

    E4A易安卓判断奇偶数源码

    E4A易安卓判断奇偶数源码。对某些数组进行处理时,需要取偶数项元素,因此用到判断奇偶数方法,自己写了个判断正整数为奇数还是偶数的方法,比较简单,也很方便调用,供大家参考

    IF判断语句和FOR循环语句的搭配使用.xlsm

    IF判断语句和FOR循环语句的搭配使用.xlsm

    vb求最大公约数和最小公倍数

    在上面的代码中,我们首先将两个数字赋值给变量a和b,然后使用If语句判断哪个数字更大,从而确定最大公约数的初始值。然后,使用Do While循环语句来寻找最大公约数。在每次循环中,我们判断当前值是否能够被a和b整除...

    Python基础教程之if判断,while循环,循环嵌套

     判断语句又被称为分支语句,有判断,才有分支; if判断语句基本语法 if语句格式: if 判断的条件:  条件成立后做的事  … … 代码缩进为一个tab键,或者四个空格,官方建议使用空格;但应注意,在python开发中...

    java_判断与循环语句笔记

    java_判断与循环语句笔记,每一个知识点都实例辅佐理解!

    SQL 水仙数求法

    在实际应用中,如果需要将这个功能集成到数据库查询中,可能需要将其转换为SELECT语句,或者作为存储过程或函数来调用。 总结一下,解决SQL水仙花数问题的关键在于: - 使用循环结构遍历可能的数字范围。 - 分解...

    java 小程序,求素数和判断闰年

    在这个“java小程序”中,我们有两个关键的算法实现:检查一个数是否为素数以及判断是否为闰年。 首先,让我们深入理解素数的概念。素数是大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。例如,2、3、...

    C语言实现查找并打印所有三位数的水仙花数

    程序通过遍历100到999之间的所有数,对每一位数字进行处理,计算每位数字的立方和,最终判断该数是否为水仙花数并打印结果。 适合人群:具备基本C语言编程基础的学习者和开发者。 使用场景及目标:①理解和掌握水仙...

Global site tag (gtag.js) - Google Analytics