博主的代码写的很漂亮,我还是花了挺久时间理解的,这里我写出了详细的解释说明
#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
long long convert(string n, long long radix) {//把n转换成十进制
long long sum = 0;
int index = 0, temp = 0;
for (auto it = n.rbegin(); it != n.rend(); it++) {//未知迭代器类型故用auto
temp = isdigit(*it) ? *it - '0' : *it - 'a' + 10;//isdigit():判断迭代器指向的内容是否是整数
sum += temp * pow(radix, index++);//把n从当前radix进制转换成10进制
}
return sum;
}
long long find_radix(string n, long long num) {
char it = *max_element(n.begin(), n.end());//找到要改变进制的n中最大的元素it,it是要搜索的进制的最小值,因为进制再小一点的话当前的最大元素就不会被显示了
long long low = (isdigit(it) ? it - '0': it - 'a' + 10) + 1;//把it表示为10进制
long long high = max(num, low);//进制的上界是不用改变进制的那个数的10进制表示数 和 要改变进制的n中最大的元素it的十进制表示数 中较大的那个
while (low <= high) {//二分法查找合适的进制
long long mid = (low + high) / 2;
long long t = convert(n, mid);//将当前mid进制的n,转化为十进制的数t
if (t < 0 || t > num) high = mid - 1;//t<0:t太大会溢出,t太大了:当前进制太大(这里自己根据sample手算一下就能理解)
else if (t == num) return mid;
else low = mid + 1;
}
return -1;
}
int main() {
string n1, n2;
long long 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));//tag = 1 :radix是n1的进制,要改变n2的进制,使它与radix进制的n1转换成的10进制的数相等
if (result_radix != -1) {
printf("%lld", result_radix);
} else {
printf("Impossible");
}
return 0;
}