PAT甲级1010

三点要特别注意的:
1.要使用二分查找法,有一个测试点非常的大,如果从小到大顺序查找的话会超时
2.注意整形可能会越界,解决方法使用长整型3数据类型,但是仍会溢出,所以要判断是否小于零,或者给予一个上界
3.由于采用二分查找,所以要注意存在多个指数满足条件的情况——字符串仅最后一位为非零值,这时只需提前判断一下最小合理值是否满足条件

#include
#include
#include
using namespace std;
int trans(char c){
	if(c<='9')
			return (c-'0');
		else
			return (c-'a'+10);
}
long long get_value(string s,long long radix){
	long long sum=0;
	for(int i=0;i<s.length();i++)
		sum+=trans(s[i])*pow(radix,s.length()-i-1);
	return sum;
}
int get_max(string s){
	char max=s[0];
	for(int i=0;i<s.length();i++) 
		max=s[i]>max?s[i]:max;
	return trans(max);
}
void find_radix(string s,long long sum){
	long long pre,back;
	pre=get_max(s)+1;
	int t=max(sum,pre);
	back=max(t,50);
	if(sum==get_value(s,pre))
		{
			cout<<pre;
			return;
		}
	while(pre<=back){
		long long mid=(pre+back)/2;
		long long total=get_value(s,mid);
		if(total==sum)
		{
			cout<<mid;
			return;
		}
		else if(total>sum||total<=0)
			back=mid-1;
		else
			pre=mid+1;
	} 
	cout<<"Impossible";
	return;
}
int main(){
	string N1,N2;
	int tag,radix;
	cin>>N1>>N2>>tag>>radix;
	if(tag==1)
		find_radix(N2,get_value(N1,radix));
	else
		find_radix(N1,get_value(N2,radix));
	return 0;
} 

你可能感兴趣的:(PAT)