天天看點

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

參考文章