刷完pat甲级1010真题题库(10/155) 基数(Radix)
输入
四个数N1,N2,tag,radix,tag=1时N1是radix进制数,tag=2时N2是radix进制数
输出
返回最小的进制数,使得N1==N2,不存在则返回Impossible
思路
- 把N1,N2都转为10进制数进行比较,对于tag=2是可以swap(N1,N2)则我们一直是知道N1的进制数,只需处理N2
- 注意转为10进制时用long long,且long long也可能溢出,此时就要记录溢出用-1表示,实际上溢出是一个更大的数
- 二分的上下界:下界是N2中的最大值+1,上界是N1的十进制表示
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
long long toDecimal(string& s, long long radix){
long long temp = 0;
for (int i = 0; i < s.size();i++){
if(s[i] >= '0' && s[i] <= '9')
temp = temp * radix + (s[i] - '0');
else
temp = temp * radix + (s[i] - 'a' + 10);
}
return temp;
}
int return_l(string a){//求出下界,就是字符串内最大的数+1
int b=0;
for(int i=0;i<a.size();i++){
int temp=0;
if(a[i]>='a'&&a[i]<='z') temp=a[i]-'a'+10;
else temp=a[i]-'0';
if(temp>b) b=temp;
}
return b+1;
}
int main(){
string t,b;
int tag,radix;
cin>>t>>b>>tag>>radix;
if(tag==2) swap(t,b);
ll a=toDecimal(t,radix);
ll l=return_l(b),r=max(a,l);
while(l<r){
ll mid=(l+r)>>1;
ll res=toDecimal(b,mid);
if(res<0||res>=a) r=mid;
else l=mid+1;
}
if(toDecimal(b,l)==a) cout<<l<<endl;
else cout<<"Impossible"<<endl;
return 0;
}