二分的思想和应用

本文详细介绍了二分查找算法及其在不同场景的应用,包括查找递增序列中特定元素的位置和求解方程的根。同时,还深入探讨了快速幂算法的递归与迭代实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 . 二分查找

//A[]为递增序列,x为欲查询的数,函数返回第一个大于等于x的元素的位置
//二分上下界为左闭右闭,[left,right],传入的初值为[0,n]
int lower_bound(int A[],int left,int right, int x){
	int mid;
	while(left<right){ //对于[left,right]来说,left==right意味着找到唯一位置
		mid=(left+right)/2;
		if(A[mid]>=x)
			right=mid; //往左子区间[left,mid]查找
		else				
			left=mid+1; //往右子区间[mid+1,right]查找
	}
	return left; // 返回夹出来的位置
}

//A[]为递增序列,x为欲查询的数,函数返回第一个大于x的元素的位置
//二分上下界为左闭右闭,[left,right],传入的初值为[0,n]
int upper_bound(int A[],int left,int right,int x){
	int mid;
	while(left<right){
		mid=(left+right)/2;
		if(A[mid]>x)
			right = mid;
		else
			left=mid+1;
	}
	return left;
}

2. 二分的思想还可应用到求解方程,例如求解根2

const double eps = 1e-5; //精度
double f(double x){ //计算f(x)
	return x*x-2;
}
double solve(double L,double R){
	double left=L,right=R,mid;
	while(right-left>eps){
		mid=(left+right)/2;
		if(f(mid)>0){
			right=mid;
		}else{
			left=mid;
		}
	}
	return mid; //所返回的当前mid值为f(x)=0的根
}

3. 快速幂问题,求a^b%m

Note:条件if(b%2==1) 括号里可以用b&1代替,这里b&1进行位与操作,判断b的末位是否为1,因此当b为奇数时b&1返回1,if条件成立

//递归快速幂
typedef long long LL;
//求a^b %m , 递归写法
LL binaryPow(LL a,LL b,LL m){
	if(b==0) return 1; //如果b为0,那么a^0=1
	// b为奇数,转换为b-1
	if(b%2==1) return a*binaryPow(a,b-1,m)%m;
	else { //b为偶数,转换为b/2
		LL mul = binaryPow(a,b/2,m);
		return mul*mul%m;
	}
}

//迭代快速幂
typedef long long LL;
LL binaryPow(LL a,LL b,LL m){
	LL ans =1;
	while(b>0){
		if(b&1){ //如果b为奇数
			ans=ans*a%m; //令ans累积上a
		}
		a=a*a%m; //令a平方
		b>>=1; // 将b的二进制右移一位,即b=b/2
	}
	return ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪突猛进!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值