二分查找
1、标准模板
int Binary_search(int *num,int n,int x){
int head = 0,tail = n-1,mid;
while (head <= tail){
mid = (head + tail) >> 1;
if (num[mid] == x) return mid;
else if (num[mid] > x) tail = mid - 1;
else head = mid + 1;
}
return -1;
}
int main()
{
int num[10];
for (int i = 0; i < 10; i++){
num[i] = i * i;
}
// 0 1 2 3 4 5 6 7 8 9
// 0 1 4 9 16.....
int x;
while(scanf("%d",&x)!=EOF){
int res = Binary_search(num,10,x);
printf("%d * %d = %d\n",res,res,res*res);
}
return 0;
}
结果 (查找值value所在的下标index,index * index = value)
可以运用到 输入一个整数x,返回一个sqrt(x)
2、二分查找传入函数
int f(int x){
return x*x;
}
int Binary_search(int (*num)(int),int x){
int head = 0,tail = x,mid;
while (head <= tail){
mid = (head + tail) >> 1;
if (num(mid) == x) return mid;
else if (num(mid) > x) tail = mid - 1;
else head = mid + 1;
}
return -1;
}
int main()
{
int x;
while(scanf("%d",&x)!=EOF){
int res = Binary_search(f,x);
printf("%d * %d = %d\n",res,res,res*res);
}
return 0;
}
即可实现整数求根号
3.1、扩展 求解三次根号
更改
int f(int x){
return x*x*x;
}
3.2 扩展 求解实数求根号
注意点
(1)、x小于1时,sqrt(x) > x,所以要把tail设置为1
(2)、设定一个误差,当tail-head小于误差就停止
#include <stdio.h>
#include <math.h>
#define EPSI 1e-7
double f(double x){
return x*x;
}
double Binary_search(double (*num)(double),double x){
double head = 0,tail = x,mid;
if (x < 1.0) tail = 1.0;
while (tail - head >= EPSI){
mid = (head + tail) / 2.0;
if (num(mid) == x) return mid;
else if (num(mid) > x) tail = mid;
else head = mid;
}
return head;
}
int main(int argc, char *argv[])
{
double x;
while(scanf("%lf",&x)!=EOF){
double res = Binary_search(f,x);
printf("sqrt(%g) = %g\n",x,sqrt(x));
printf("my_sqrt(%g) = %g\n\n",x,res);
}
return 0;
}