c++二分法迭代中为什么min=(end-beg)/2不行?而要用min=beg+(end-beg)/2 ?
发布网友
发布时间:2022-04-23 13:52
我来回答
共3个回答
热心网友
时间:2023-10-16 17:20
题主你应该写错了,不是(end - beg)/2,应该是:
beg+(end-beg)/2 = (beg + end)/2
而且(end-beg)/2只是区间长度的一半,而(beg + end)/2才是beg和end的中间位置。
至于为什么要用beg+(end-beg)/2而不是 (beg + end)/2。
因为假设beg和end都很大,超过了int的一半,那么beg + end可能会溢出,这时候再除2也无济于事。而如果用beg+(end-beg)/2就不会溢出,因为(end-beg)不会溢出,除2更不会溢出,至于beg+(end-beg)/2,这个加法肯定不会超过end,所以也就不会溢出啦!
热心网友
时间:2023-10-16 17:20
二分法 是每次向两个点中间收缩的
比如 上一次是100到1000,那么下一次的点 就要在这个中间。 比如n,需要满足
100<n<1000
如果用min=(end-begin)/2
举个例子
end=100
begin=90
那么min=5
明显不对 需要的是95啊
热心网友
时间:2023-10-16 17:20
道理是算法不正确 ~~~~~
热心网友
时间:2023-10-16 17:20
题主你应该写错了,不是(end - beg)/2,应该是:
beg+(end-beg)/2 = (beg + end)/2
而且(end-beg)/2只是区间长度的一半,而(beg + end)/2才是beg和end的中间位置。
至于为什么要用beg+(end-beg)/2而不是 (beg + end)/2。
因为假设beg和end都很大,超过了int的一半,那么beg + end可能会溢出,这时候再除2也无济于事。而如果用beg+(end-beg)/2就不会溢出,因为(end-beg)不会溢出,除2更不会溢出,至于beg+(end-beg)/2,这个加法肯定不会超过end,所以也就不会溢出啦!
热心网友
时间:2023-10-16 17:20
二分法 是每次向两个点中间收缩的
比如 上一次是100到1000,那么下一次的点 就要在这个中间。 比如n,需要满足
100<n<1000
如果用min=(end-begin)/2
举个例子
end=100
begin=90
那么min=5
明显不对 需要的是95啊
热心网友
时间:2023-10-16 17:20
道理是算法不正确 ~~~~~