- 题目:
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
- 分析:
func函数: 给定一个数值和一个进制,将其转化为10进制数
Max_num函数: 求进制的起始位置
bin_search函数: 二分法查找进制
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
long long func(string num, long long radix){ //转化为10进制数
long long temp = 1, res = 0;
for(int i = num.size()-1; i>=0; i--){
if(num[i] >= '0' && num[i] <= '9'){
res += (num[i]-'0') * temp;
temp = temp * radix;
} else{
res += (num[i] - 'a' + 10) * temp;
temp = temp* radix;
}
}
return res;
}
int Max_num(string st){ //求出string中字符的最大值
int res = 0;
for(int i = 0; i < st.size(); i++){
if(st[i] <='9' && st[i] >='0'){
res = max(res, st[i]- '0');
} else
res = max(res, st[i] - 'a' + 10);
}
return res;
}
long long bin_search(string n, long long left, long long num){ //二分法查找进制
long long l = left;
long long r = max(left, num);
while(l <= r){
long long mid = (r + l)/2;
long long t = func(n, mid); //将n在底为mid时转化为十进制数
if(t < 0 || t > num) **//如转化为10进制数后溢出活着大于num**
r = mid-1;
else if(t == num)
return mid;
else
l = mid+1;
}
return -1;
}
int main()
{
string n1, n2;
long long tag, radix;
cin >> n1 >> n2 >> tag >> radix;
long long res = 0;
res = tag == 1? bin_search(n2, Max_num(n2)+1, func(n1, radix)) : bin_search(n1, Max_num(n1)+1, func(n2, radix));
if(res != -1)
printf("%lld", res);
else
printf("Impossible");
return 0;
}
参考:https://www.liuchuo.net/archives/2458
#include <iostream>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
long long convert(string n, int radix){
long long sum = 0;
int index = 0, temp = 0;
for(auto i = n.rbegin(); i != n.rend(); i++){ //rbegin()和rend()为倒序迭代
temp = isdigit(*i) ? *i - '0': *i - 'a' +10;
sum += temp * pow(radix, index++);
}
return sum;
}
long long find_radix(string n, long long num){
char it = *max_element(n.begin(), n.end()); //max_element()函数求出容器内第一个最大的值
long long low = (isdigit(it) ? it - '0' :it - 'a' +10)+1;
long long high = max(low, num);
while(low <= high){
long long mid = (low + high)/2;
long long t = convert(n, mid); //转化为10进制
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, res;
cin >> n1 >> n2 >> tag >> radix;
res = tag==1 ? find_radix(n2, convert(n1, radix)):find_radix(n1, convert(n2, radix));
if(res != -1)
cout << res;
else
cout << "Impossible";
return 0;
}