大佬教程收集整理的这篇文章主要介绍了为什么M = L((R-L)/ 2)而不是M =(L R)/ 2避免C中的溢出?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
int rotated_binary_search(int a[],int n,int key) { int L = 0; int R = N - 1; while (L <= R) { // Avoid overflow,same as M=(L+R)/2 int M = L + ((R - L) / 2); if (A[M] == key) return M; // the bottom half is sorted if (A[L] <= A[M]) { if (A[L] <= key && key < A[M]) R = M - 1; else L = M + 1; } // the upper half is sorted else { if (A[M] < key && key <= A[R]) L = M + 1; else R = M - 1; } } return -1; }
并看到评论说使用M = L((R – L)/ 2)而不是M =(L R)/ 2避免溢出.这是为什么?先生
让我们假设你使用无符号字符一分钟(当然也适用于更大的整数).
如果L为100且R为200,则第一个版本为:
@H_714_2@m = (100 + 200) / 2 = 300 / 2 = 22100 200个溢出(因为最大的无符号字符是255),并且得到100 200 = 44(无符号否.).
第二,另一方面:
@H_714_2@m = 100 + (200-100) / 2 = 100 + 100 / 2 = 150没有溢出.
以上是大佬教程为你收集整理的为什么M = L((R-L)/ 2)而不是M =(L R)/ 2避免C中的溢出?全部内容,希望文章能够帮你解决为什么M = L((R-L)/ 2)而不是M =(L R)/ 2避免C中的溢出?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。