1.1整数二分
为什么要补1???
处理一个边界问题
会陷入死循环
1.1.1数的范围
二分左端点
二分右端点
代码实现
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100010;
int n,m;
int q[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i = 0;i < n;i++) scanf("%d",&q[i]);
while(m--)
{
int x;
scanf("%d",&x);
//二分左端点
int l = 0,r = n - 1; //确定区间范围
while(l < r)
{
int mid = l + r >> 1;
if(q[mid] >= x) r = mid;
else l = mid + 1;
}
//判断是否存在左端点
if(q[r] == x)
{
cout<<r<<' ';
//二分右端点
r = n - 1;//右端点一定在[左端点,n - 1]之间
while(l < r)
{
int mid = (l + r + 1) >> 1;//因为l = mid所以需要加1
if(q[mid] <= x) l = mid;
else r = mid - 1;
}
cout <<l<<endl;
}
else cout<<"-1 -1"<<endl;
}
}
1.2实数二分
2.1数的三次方根
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
double x;
cin>>x;
double l = -10000,r = 10000;
while(r - l >= 1e-8)
{
double mid = (l + r) /2;
if(mid * mid * mid >=x) r = mid;
else l = mid;
}
printf("%lf\n", l);
return 0;
}
公式
#include<cstdio>
#include<cmath>
int main(){
double a;
scanf("%lf",&a);
printf("%.6lf",cbrt(a));
return 0;
}