题目:
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”
可以直接将已知radix的数转换为十进制数,然后给定一个下界和上界来通过二分查找未知radix的数中是否存在一个进制数满足N1=N2。下界是未知radix数中的最大数字,上界是已知radix的十进制数加一。
需要注意的是,在二分查找中,若radix过大则会出现越界,所以需要判断<0的情况。
代码如下:
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
long long decimal(string N, long long radix) {
int k = 0;
long long value = 0;
for (int i = N.length() - 1; i >= 0; i--) {
if (N[k] >= '0' && N[k] <= '9')
value += ((N[k++] - '0') * pow(radix, i));
else
value += ((N[k++] - 'a' + 10) * pow(radix, i));
}
return value;
}
long long Binary(string N, long long left, long long right,long long value) {
long long mid, sum;
while (left <= right) {
mid = (left + right) / 2;
sum = decimal(N, mid);
if (sum == value) return mid;
else if (sum > value||sum <0 ) right = mid - 1;//sum<0说明越界,mid太大
else left = mid + 1;
}
return 0;
}
int main() {
string n1, n2, N1, N2;
int tag;
long long value1, radix,MAX=0;
cin >> n1 >> n2 >> tag >> radix;
/*判断tag*/
if (tag == 1) {
N1 = n1;
N2 = n2;
}
else {
N1 = n2;
N2 = n1;
}
value1 = decimal(N1, radix);
/*寻找未知radix的number中最大的digit*/
for (int i = 0; i < N2.length(); i++) {
if (N2[i] >= '0' && N2[i] <= '9') {
if ((N2[i] - '0') > MAX)
MAX = N2[i] - '0';
}
if (N2[i] >= 'a' && N2[i] <= 'z'){
if ((N2[i] - 'a' + 10) > MAX)
MAX = N2[i] - 'a' + 10;
}
}
long long rad = Binary(N2, MAX + 1, value1 + 1, value1);
if (rad == 0)
cout << "Impossible";
else
cout << rad;
}