二分查找实现sqrt

二分查找

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值