在用到二分法时,除了搜索集合中存在的元素外,还有一种情况就是搜索的元素不在集合中,但是却在集合中某两元素的区间上,比如 4.2 在元素4,5之间。在解决实际问题时经常会遇到向上或者向下取整的问题。比如通过二分枚举答案时,可能解不是整数,因而需要取整。
但是真正写起来却没那么容易,经常出现死循环或者其他错误。之前一直没有认真的总结过,所以今天就认真研究了一下这个问题,并且尽量用简洁清晰的代码表示出来。
代码如下:
while(up>=low)
{
mid=(up+low)/2;
if(a[mid]>x)
{
///ans=mid; //对上取整
up=mid-1;
}
else
{
ans=mid; ///对下取整
low=mid+1;
}
}
printf("%d\n",a[ans]);
当然不止是取整,还可能是取最接近的值,但是也是一样的,只需稍微改动一下就可以。