不使用比较判断符和比较函数来比较两个数的大小

在看数学时候,突然又想起了一个大一时被学长问过的问题,很有趣的问题,我也把它又出给了大一的孩子们,思考题如下:

如何不使用判别符号和比较函数比较两个数的大小?

乍一看脑子里回想很多,比如三目运算,比如二进制位判断,但是回过头一想,就会发现,之前的还使用了比较判别符号。算法的思维的重要性就体现了。

这个问题确实不止一种解决方法,有数学思维的使用,或者计算机思维的方式。

方法一:使用和差法

这是一个高数中典型的理论,估计也曾经是个经典例题

设f(x)和g(x)为连续函数,如果令

U=max{f(x),g(x)},V=min{f(x),g(x)},

那么能够得出

很简单的我们就可以将这两个式子实现了。

方法二:移位判别

a - b的结果, 进行移位, 取符号位, 0说明结果是正数, a > b, 1说明结果是负数, a < b

1
2
3
4
5
6
7
8
9
10
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 2;
String[] buf = { "a>=b", "a < b" };
int id1 = (a - b) >>> 31;
System.out.println(id1); // 1
System.out.println(buf[id1]); // a < b
}
}

方法三:异常判别

分配一个长度为a的数组array[a], 判断array[b]是否越界, 越界在java中会抛出异常

其实我个人觉得这个方法有点耍流氓。。。不过也是一种很独特的思维了吧