目录
一,整数二分
整数二分有两种情况一定要注意边界问题,细节处理再代码中注释已写出
如图:
第一种
第一种将区间分为[l,mid]和[mid+1,r]
int erfen1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid))
r = mid; //check判断是否满足性质,如果满足性质后是r=……,那么mid就为左右区间的一半
else
l = mid + 1;
}
return l;
}
第二种:
第二种将区间分为[l,mid-1]和[mid,r]
int erfen2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid))
l = mid; //check判断是否满足性质,如果满足性质后是l=……,那么mid就为左右区间+1的一半
else
r = mid - 1;
}
}
二,实数二分
实数二分相较于整数二分简单,代码如图:
#include<iostream> //实数二分模板(一个数开平方根的例子)
#include<algorithm>
using namespace std;
int main()
{
double x;
cin >> x;
double l = 0, r = x;
while (r - l > 1e-8) //范围建议比题目要求小10的-2次方
{
double mid = (l+r)/2;
if (mid * mid >= x) //实数二分不用考虑边界问题
r = mid;
else
l = mid;
}
printf("%lf", l);
return 0;
}