看二分法的一句代码,很有意思:
int mid = low + ((high - low) / 2);
这个与二分法求两数平均值的结果是一样的,为什么要这样写呢?
查阅资料后很好理解,这是为了避免数值溢出的问题。如果直接按照原来的思路来写:
int mid = (low + high) / 2;
C++本身对int类型的字符就有4Bytes(32位)的存储上限要求,也就是说int类型的字符的取值范围在-2^32~(2^32-1)。如果low和high本身就达到范围值了怎么办?就会造成报错溢出。
平时习惯用Python写,Python3避免了这个问题,只要不超出内存范围,就不需要Codinger设计担心这个问题。
有好的习惯,还可以写成:
int mid = (low+high)>>>1;
值得注意的是,这样写虽然可以避免溢出,但是会造成结果错误的情况:
int mid = high/2+ low/2;
当high或者low中两者都为奇数时,结果会错。
eg:high=3 low=5 则mid本应该等于4,但是这种算法算出来为1+2=3!!
对二分法的好处理(骚操作