1010 Radix
题目
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes
, if 6 is a decimal number and 110 is a binary number.
Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.
Input Specification:
Each input file contains one test case. Each case occupies a line which contains 4 positive integers:
N1 N2 tag radix
Here N1
and N2
each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a
-z
} where 0-9 represent the decimal numbers 0-9, and a
-z
represent the decimal numbers 10-35. The last number radix
is the radix of N1
if tag
is 1, or of N2
if tag
is 2.
Output Specification:
For each test case, print in one line the radix of the other number so that the equation N1
= N2
is true. If the equation is impossible, print Impossible
. If the solution is not unique, output the smallest possible radix.
Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible
分析
本题大体上的思路比较简单,就是使用二分查找的思想,找到合适的那个radix。但是细节上的东西非常多。首先一个坑的点就是题目中没有给出radix等数据的范围,必须要使用long long类型才行,其转化过程中还可能产生溢出。下面结合代码分析
代码
#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
long long convert(string n, long long radix){ //进制转换 radix进制转为10
long long sum = 0;
int index = 0, tmp = 0;
for(auto it=n.rbegin(); it != n.rend(); it++){
tmp = isdigit(*it)?*it-'0':*it-'a'+10;
sum += tmp * pow(radix, index++);
}
return sum;
}
// 二分法 寻找合适的radix n是待确定的数字 num是确定进制的数字
long long find_radix(string n, long long num){
char it = *max_element(n.begin(), n.end()); // stl库 寻找最大的元素
// 这里使用 max_element用作下限 是因为一个数中不会出现比进制更大的digit
long long low = (isdigit(it)?it-'0':it-'a'+10)+1;// 将digit转化为数值
long long high = max(num, low); //用两者中较大的一个作上限
while(low <= high){
long long mid = (low+high)/2;
long long t = convert(n, mid); // 根据mid进制转换的结果
if(t < 0|| t>num){
high = mid - 1;
} else if(t == num){
return mid;
} else{
low = mid + 1;
}
}
return -1;
}
int main(){
string n1, n2;
long long tag=0, radix=0, result_radix;
cin >> n1 >> n2 >> tag >> radix;
result_radix = tag==1 ? find_radix(n2, convert(n1, radix)): find_radix(n1, convert(n2, radix));
if(result_radix != -1){
printf("%lld", result_radix);
} else{
printf("Impossible");
}
return 0;
}