整形二分查找
1. 在一个指定的区间内查找一个数
#include<bits/stdc++.h>
using namespace std;
int x, le, mx;
int main() {
cin >> le >> mx >> x; // 用二分查找从1~mx之间查找x
for(int l = le, r = mx;l <= r;) {
int mid = (l+r) / 2;
printf("%d\n", mid);
if(mid == x) break;
if(mid < x) l = mid+1;
else if(mid > x) r = mid-1;
}
return 0;
}
2.在一个数组中查找一个数
题目描述
在一个整形数组中查找一个数,如果找到输出这个数的下标,如果找不到输出-1
(不需要输出查找过程)
#include<bits/stdc++.h>
using namespace std;
int n, a[100005], x, rem;
int main() {
bool flag = false;
scanf("%d", &n);
for(int i = 1;i <= n;++i) scanf("%d", a+i);
scanf("%d", &x);
for(int l = 1, r = n;l <= r;) {
int mid = (l+r) / 2;
if(a[mid] == x) {flag = true; rem = mid; break;}
else if(a[mid] < x) l = mid+1;
else r = mid-1;
}
if(flag) printf("%d", rem);
else puts("-1");
return 0;
}
浮点型二分查找
1.二分法求平方根
题目描述
给定一个n(1 <= n <= 2*109), 用二分法求出n的x(2 <= x <= 20)次方根,保留小数点后6位。
#include<bits/stdc++.h>
using namespace std;
double mid;
int n, x;
int main() {
scanf("%d%d", &n, &x);
for(double l = 0, r = 2e9;r-l >= 0.0000001;) {
mid = (l+r) / 2;
if(pow(mid, x) < n) l = mid;
else r = mid;
}
printf("%.6lf", mid);
return 0;
}