1010 Radix (25分)
首先注意进制数不只是我们平时常用的那几种
注意string类型转换成int类型
- 第一步:先判断出要查找的这个数的进制上下限,下限是该数最大的那个数,上限是两个数中最大的那个数的十进制数
- 第二步:二分查找,转换成十进制之后,如果该数小于已确定数,说明进制太小,如果大于或者为负数,则证明进制太大
tips:单位数的时候从二进制依次往上找
- rbegin()反向迭代器,begin()迭代器,用法都是固定的,记住就好
- int isdigit(int) 参数是字符或ASCII码,判断是否是数字
- *max_element(n.begin(),n.end()) 在区间内找极值
- 标准文件中包含max()等函数
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
// 将输入的string类型变量转换为十进制的数
long long convert(string n,long long radix){
long long num=0;
int i=0,temp;
for(auto t=n.rbegin();t!=n.rend();t++){
temp = isdigit(*t)? *t-'0':*t-'a'+10;
num += temp*pow(radix,i++);
}
return num;
}
long long FindRadix(string n, long long num){
char t = *max_element(n.begin(),n.end());
long long low = (isdigit(t)?t-'0':t-'a'+10)+1;
long long high = max(low,num);
long long temp;
while(low<=high){
long long mid = (low+high)/2;
temp = convert(n,mid);
if(temp == num)return mid;
else if(temp < 0 || temp > num)high=mid-1;
else low=mid+1;
}
return -1;
}
int main(){
string n1,n2; // N1和N2不超过10位
int tag; // 取值为1或2,指定后面的进制对应的是哪一个数
long long radix; // 其中一个数的进制
cin>>n1>>n2>>tag>>radix;
long long result = tag==1?FindRadix(n2,convert(n1,radix)):FindRadix(n1,convert(n2,radix));
if(result!=-1){
cout<<result<<endl;
}
else{
cout<<"Impossible"<<endl;
}
return 0;
}