2020/10/23二分法

本文回顾了高中对分查找原理,并讲述了作者尝试用快速幂解决大数问题的过程,最终转向使用log10简化计算。通过实例展示了如何利用二分法和math库的log10函数求解问题,重点在于理解循环条件和优化算法应用。
摘要由CSDN通过智能技术生成

练习使用二分法

高中的时候学过对分查找,但是还没怎么使用过,这次试试看。
题目:
在这里插入图片描述一开始我想的是用快速幂求(因为最近学了这个,所以想遛一遛),结果因为数据太大中途归零出错了,这段代码在下面:

#include<iostream>
using namespace std;
long long pow(long long base,long long index)//快速幂
{
	long long ans=1;
	while(index>0)
	{
		if(index&1)
			ans=ans*base;
		base=base*base;
		index=index>>1;
	}
	return ans;
}
int main()
{
	long long x=1,n,low,ans;
	cin>>n;
	low=pow(10,n-1);
	while(pow(x,x)<low)
		x=x<<1;
	long long lst=(x>>1)+1,hst=x;
	while(lst<hst)
	{
		long long mid=(lst+hst)>>1;
		if(pow(mid,mid)==low)//恰好相等情况 
		{
			ans=pow(mid,mid);
			break;
		}
		else if(pow(mid,mid)>low)
		{
			if(pow(mid-1,mid-1)<low)//一般找到情况
			{
				ans=pow(mid,mid);
				break;
			}
			hst=mid;
		}
		else if(pow(mid,mid)<low)
			lst=mid;
	}
	
	cout<<ans; 
	return 0;
}

无奈之下找了找大佬们的方法,发现他们都用了cmath的log10(double)这个函数。
这个东西可以直接求n是几位数,即 n的位数=log10(n)+1,这样就用不到我那个麻烦的快速幂了,就考虑后面的二分法具体的某些点了。
一个是循环结束条件,看了看大佬并没有特别写结束返回的值,最后直接用l,的确可以,while循环条件是l<h,所以最后l>=h,而要求的是不小于n位数的值,所以用l就可以了,还能保证求出的是最小值。
最后

 #include<iostream>
#include<cmath>
using namespace std;
#define LL long long int
int main()
{
   int n;
   LL l=1,h=2e9;
   cin>>n;
   while(l<h)
   {
   	LL mid=(l+h)>>1;
   	LL len=mid*log10(mid)+1;
   	if(len<n)
   		l=mid+1;
   	else
   		h=mid;
   }
   cout<<l;
   return 0;
}

一般来说

int low=0,high=n-1;
while(low<high)
{
	int mid=(low+high)>>1;
	if(mid==target)
		return mid;
	else if(mid<target)
		low=mid+1;
	else
		high=mid-1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值