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

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

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

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

方法一:使用和差法

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

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

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

那么能够得出

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

方法二:移位判别

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

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 中会抛出异常

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