【PAT甲级】1010 Radix (25 分)(二分)

题意:输入两个数可能包含小写字母,1或者2,进制大小。第三个数为代表第一个数是第四个数进制的,求第二个数等于第一个数时进制的大小,不可能则输出Impossible,第三个数为2代表第二个数是第四个数进制的,求第一个数等于第二个数时进制的大小,不可能则输出Impossible。数字的位数最多是十位。

trick:进制可能很大,所以运算过程中可能会爆long long,不必担心,当成负数处理即可。

代码:

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
long long t,rad;
int main(){
cin>>s1>>s2>>t>>rad;
if(t==2)
swap(s1,s2);
long long num1=0,num2=0;
int len1=s1.size(),len2=s2.size();
for(int i=0;i<len1;++i){
num1*=rad;
if(s1[i]>='0'&&s1[i]<='9')
num1+=s1[i]-'0';
else
num1+=s1[i]-'a'+10;
}
int mx=0;
for(int i=0;i<len2;++i)
if(s2[i]>='0'&&s2[i]<='9')
mx=max(mx,s2[i]-'0');
else
mx=max(mx,s2[i]-'a'+10);
long long l=mx+1;
long long r=max(l,num1);
long long mid=0;
while(l<=r){
mid=(l+r)>>1;
string x=s2;
long long tmp=0;
for(int i=0;i<len2;++i){
tmp*=mid;
if(x[i]>='0'&&x[i]<='9')
tmp+=x[i]-'0';
else
tmp+=x[i]-'a'+10;
}
if(tmp>num1||tmp<0)//顺序写反会错
r=mid-1;
else if(tmp<num1)//顺序写反会错,因为溢出的话tmp小于0,一定小于num1
l=mid+1;
else{
cout<<mid;
return 0;
}
}
cout<<"Impossible";
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11228282.html