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
给定n1、n2两个数,求可以是两者相等的进制;如果没有,输出Impossible
二分法、取值范围
PS. 这道题目比较坑,没有对取值范围说明,int 肯定会越界,long long int 可能也会;最大取值范围也没有说明
1、如果 tag == 2 ,交换,之后遇到类似的题目,也可以这样处理;
2、求 n1 的10进制数值,按照二分法求解 n2 对应 radix 下的数值,判断是否相等,相等的话,退出,不相等的话,更新 left 和right 的值;
3、在二分法求解的过程中,long long int 可能会越界,如果求得的值 < 0 说明越界,radix 过大。这也是测试系统的一个问题,有可能全都越界,这种情况很难处理。
#include
#include
#include
#include
using namespace std;
long long int to10(string s, int radix) {
long long int sum = 0;
for (int i = 0; i < s.length(); ++i) {
if (isdigit(s[i]))
sum = sum*radix+s[i] - '0';
else if (isalpha(s[i]))
sum = sum*radix+s[i] - 'a'+10;
}
return sum;
}
long long int findRadix(long long int n, string s, long long int left, long long int right) {
long long int m;
while (left <= right) {
long long int mid = (left + right) / 2;
m = to10(s, mid);
if (m == n) {
return mid;
}
//进制太大
else if (m > n||m<0)
right = mid-1;
//进制太小
else
left = mid+1;
}
return -1;
}
int main() {
string s1, s2;
//读取数据,预处理
int tag, radix;
cin >> s1 >> s2 >> tag >> radix;
if (tag == 2)
swap(s1, s2);
//s1转10进制
long long int n1, n2;
n1 = to10(s1, radix);
//寻找s2的最小进制
long long int min_radix = 0;
for (int i = 0; i < s2.length(); ++i) {
if (isdigit(s2[i])) {
if (s2[i] - '0' > min_radix)
min_radix = s2[i] - '0'+1;
}
else if (isalpha(s2[i])) {
if (s2[i] - 'a' + 10 > min_radix)
min_radix = s2[i] - 'a' + 10+1;
}
}
//二分法
long long int max_radix = max(n1, min_radix);
long long int ans = findRadix(n1, s2, min_radix, max_radix);
//输出结果
if (ans == -1)
cout << "Impossible";
else
cout << ans;
system("pause");
return 0;
}