洛谷P2759 奇怪的函数(二分法,关于左闭右闭,左闭右开的问题没想明白的请看Carl大师,链接下面补充)

本文介绍了一个名为findMin的函数,使用二分法寻找满足给定数值n所需的最小正整数x,其位数x^x大于等于n。通过递增性质优化搜索,避免越界并提高效率。附带左闭右闭版本和参考链接。
#include<stdio.h>
#include<math.h>

int findMin(int n) {//左闭右开
	int l = 1, r = 2e9;//2E9表示INT_MAX
	while (l < r) {
		int mid = (r - l) / 2 + l;//这里为了避免越界问题mid+(l+r)/2,写成我那样
		if (mid * log10(mid) +1< n) {
			l = mid + 1;
		}
		else {
			r = mid;
		}
	}
	return l;
}
int main() {
	int n;
	scanf("%d", &n);
	int result = findMin(n);
	printf("%d", result);
	return 0;
}





//左闭右闭
//int findMin(int n) {
//	int l = 1, r = 2e9-1;
//	while (l <= r) {
//		int mid = (r - l) / 2 + l;
//		if (mid * log10(mid) +1< n) {
//			l = mid + 1;
//		}
//		else {
//			r = mid-1;
//		}
//	}
//	return l;
//}

ps:

1.有些编译器可能没有math的库函数log10,所以需要用到换底公式。

2.求一个数是多少位,有一个方法如下图,log10x的x次方,把x次幂提到前面,就是x乘以log10x+1,比如100是三位数,log10(100)=2,2+1=3,所以是三位数

3.以防越界问题没懂的话请看carl的视频,链接在下面

 

5.

这道题使用二分法的原因是,我们要找到一个最小的正整数 x,使得 x^x 的位数达到或超过给定的 n。通过观察,我们知道 x 是一个递增函数,即 x 越大,x^x 的值越大。

使用二分法的关键在于,我们可以通过检查 x 的中间值来确定我们应该在哪一侧继续搜索。如果 mid * log10(mid) < n,那么说明 mid 还不够大,我们需要在 mid 的右侧搜索;否则,说明 mid 可能太大,我们需要在 mid 的左侧搜索。

这样,通过二分法,我们能够在每次迭代中缩小搜索范围,快速找到满足条件的最小正整数 x。由于 x 是递增的,因此在找到一个满足条件的 x 后,就可以确保它是最小的。

总的来说,使用二分法可以有效地加速搜索过程,减少不必要的计算,从而更高效地找到满足条件的最小正整数 x。

这是左闭右闭,r=numsize-1

这是左闭右开

链接在此:Carl很强,大家多向他学习!!!

https://www.bilibili.com/video/BV1fA4y1o715/?spm_id_from=333.337.search-card.all.click&vd_source=bd64c3d19eace74a8f4781bdb1026eb4

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值