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
解题思路:
1.首先我们肯定得明确,将所有数字转换为10进制统一比较。
2.数据肯定会有非常大的,而且n1,n2得用string类型来存储,以便于进制转换。
3.注意我们需要尝试的进制范围(对于99这么一个数,最小的进制是10,而不会小于等于9),同时为了防止运行超时我们选择二分法。
#include<iostream>
#include<string>
#include<math.h>
#include<ctype.h>
#include<algorithm>
#define ll long long
using namespace std;
ll convertion(string num,ll radix) //将各种进制的数转换为10进制
{
int len = num.length();
ll sum = 0;
int p = 0,tmp;
for (int i = len - 1; i >= 0; i--)
{
if (isdigit(num[i]))
tmp = num[i] - '0';
else tmp = num[i] - 'a' + 10;
sum += tmp*pow(radix, p++);
}
return sum;
}
ll find(string num1, ll num2)
{
char maxs = *max_element(num1.begin(), num1.end());
ll low;
if (isdigit(maxs))
low = maxs - '0'+1;
else low = maxs - 'a' + 11;
ll high = max(low, num2);
while (low <= high)
{
ll mid = (low + high) / 2;
if (convertion(num1, mid) > num2||convertion(num1, mid) < 0) //注意这个小于0的情况,即说明数据超过了长整型大小
high = mid - 1;
else if (convertion(num1, mid) < num2)
low = mid + 1;
else return mid;
}
return -1;
}
int main()
{
string n1, n2;
ll radix;
int tag;
cin >> n1 >> n2 >> tag>> radix;
int flag = 0;
if (tag == 1)
{
flag = find(n2, convertion(n1, radix));
}
else flag = find(n1, convertion(n2, radix));
if (flag>=0)
cout << flag << endl;
else cout << "Impossible" << endl;
return 0;
}