PAT 1010. Radix (25)

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int get(char ch){
	if(ch>='0'&&ch<='9'){
		return ch-'0';
	}
	else if(ch>='a'&&ch<='z'){
		return ch-'a'+10;
	}
}
long long change(string str,long long radix){//转换进制 
	long long result=0,tmp=1;
	int number;
	for(int i=str.length()-1;i>=0;i--){
		number=get(str[i]);
		result+=number*tmp;
		if(result<0) return -1;
		tmp*=radix;
	}
	return result;
}
int main(){
	string n1,n2;
	long long tag,rad1,minrad2,maxrad2,m1,m2;
	cin>>n1>>n2>>tag>>rad1;
	if(tag==2){
		string tmp=n2;
		n2=n1;
		n1=tmp;
	}
	m1=change(n1,rad1);
	minrad2=0;
	for(int i=0;i<n2.length();i++){
		long long t=get(n2[i]);
		if(t>minrad2){
			minrad2=t+1;
		}
	}
	maxrad2=m1+1;
	while(maxrad2>=minrad2){
		long rad2=(minrad2+maxrad2)/2;
		m2=change(n2,rad2);
		if(m2>m1||m2==-1){
			maxrad2=rad2-1;
		}
		else if(m2<m1){
			minrad2=rad2+1;
		}
		else{
			cout<<rad2<<endl;
			return 0;
		}
	}
	cout<<"Impossible"<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/chan_yeol/article/details/53426101