PAT 甲级1010 Radix
确定要求的进制的边界,数字值随进制值单调增加,所以可用二分查找提高效率
// 1010 Radix.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
long long convert(string n, long long radix) {
long long 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++);
}
//cout << sum << endl;
return sum;
}
long long findRadix(string n, long long sum) {
//cout << sum << endl;
char it = *max_element(n.begin(), n.end());
long long low = (isdigit(it) ? it - '0' + 1 : it - 'a' + 11);
long long high = max(sum, low);
//cout << low << " " << high << endl;
while (low <= high) {
long long mid = (low + high) / 2;
long long t = convert(n, mid);
if (t == sum) {
return mid;
}
else if (t > sum || t < 0) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
return -1;
}
int main()
{
string n1, n2;
int tag;
long long radix, temp_radix;
cin >> n1 >> n2 >> tag >> radix;
temp_radix = (tag == 1 ? findRadix(n2, convert(n1, radix)) : findRadix(n1, convert(n2, radix)));
if (temp_radix == -1) {
cout << "Impossible";
}
else {
cout << temp_radix;
}
return 0;
}
待求数字n2中的每一位肯定都必须小于该进制,否则就进位了,low = max_element(n2);
若待求进制 > 另一个数字n1的实际值sum,则对n1 = abc … de, 若d不为0,d* radix >= radix > sum,n2必定大于sum。 若d = 0并且 e不为0,则e必须等于sum,但e最大不超过35,所以不符合要求
所以待求进制必须不大于sum,所以high = max(sum,low);