1010 Radix (25 分)
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
结尾无空行
Code:
#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using ll = long long ;
using namespace std;
//convert函数:给定⼀个数值和⼀个进制,将它转化为10进制。转化过程中可能产⽣溢出
//find_radix函数:找到令两个数值相等的进制数。在查找的过程中,需要使⽤⼆分查找算法,如果使⽤
//当前进制转化得到数值⽐另⼀个⼤或者⼩于0,说明这个进制太⼤~
ll convert(string n, ll radix)
{
ll sum = 0;
int index = 0, temp = 0;
for (auto it = n.rbegin(); it != n.rend(); it++)
{
temp = isdigit(*it) ? *it - '0' : *it - 'a' + 10;
sum += temp * pow(radix, index++);
}
return sum;
}
ll find_radix(string n, ll num)
{
char it = *max_element(n.begin(), n.end());//找出字符串最大元素
ll low = (isdigit(it) ? it - '0' : it - 'a' + 10) + 1;//最大元素加一才能成为可能的最小进制
ll high = max(num, low);
while (low <= high)
{
ll mid = (low + high) / 2;
ll t = convert(n, mid);
if (t < 0 || t > num)//小于0则溢出 大于零则进制过大
high = mid - 1;
else if (t == num)
return mid;
else
low = mid + 1;
}
return -1;
}
int main()
{
string n1, n2;
ll 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;
}