pat-1010(二分+进制转换)

pat-1010

思路:

用确定的进制找不确定的进制,先求出已知进制的数字n1的10进制的结果sum,用longlong表示,

接着确定n2的最小进制,遍历n2数组,找出最大的位数l。

所以n2的进制在(l+1,sum+1)范围内,这样就可以用二分法求解了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
typedef long long LL;
LL NUM(char ch)
{
	return (ch>='0'&&ch<='9')?(LL)(ch-'0'):(LL)(ch-'a'+10);
}
LL change(string ss,LL radix)
{
	int len=ss.length(),i,j;
	LL ans=0;
	for(i=0;i<len;i++){
		ans=ans*radix+NUM(ss[i]);
		if(ans<0) return -1;
	}
	return ans;
}
void SP(string &s1,string &s2)
{
	string tp=s1;s1=s2;s2=tp;
}
int main(void)
{
	string n1,n2;
	LL radix;
	int i,j,tag,len;
	cin>>n1>>n2>>tag>>radix;
	if(tag==2) SP(n1,n2);
	LL tp,l=0,sum=change(n1,radix),r,mid;
	for(i=0,len=n2.length();i<len;i++){
		tp=NUM(n2[i]);
		if(l<tp) l=tp+1;
	}
	r=sum+1;
	while(l<=r){
		mid=(l+r)>>1;
		tp=change(n2,mid);
		if(tp==-1||tp>sum) r=mid-1;
		else if(tp<sum) l=mid+1;
		else{
			cout<<mid<<endl;
			return 0;
		}
	}
	cout<<"Impossible"<<endl;
	return 0;
}

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值