#include<stdio.h>
#include<math.h>
// 0-9,a-z{10-35}--转换
int tran(char c) {
int result = 0;
if (c - '0' < 10) {
result = c - '0';
} else {
result = c - 'a' +10;
}
if (0 <= result < 35) {
return result;
}
return 0;
}
int getRadix(int radix, char n1[], int size1, char n2[], int size2) {
int sum = 0;
int sum2 = 0;
int result = 0;
int size= size1>size2? size1:size2;
for(int i=0;i<size;i++){
if(i<size1 && tran(n1[i])<radix){
sum = sum + tran(n1[i]) * pow(radix, size1-1-i);
}
if(i<size2 && tran(n2[i])<radix){
sum2 = sum2 + tran(n2[i]) * pow(radix, size2-1-i);
}
}
if (sum == sum2) {
result = radix;
}
if (sum < sum2) {
int radix2 = radix - 1;
int right = radix - 1;
int left = 2;
while(radix2 >= 2){
sum2 = 0;
for (int i = 0; i<size2; i++) {
if(tran(n2[i])<radix2){
sum2 = sum2 + tran(n2[i]) * pow(radix2, size2-i-1);
}
}
if (radix2 == 2 && sum != sum2 ) {
break;
}
if (sum == sum2 ) {
result = radix2;
break;
}else if(sum < sum2){
right = radix2;
radix2 =left + (right -left)/2;
} else{
left = radix2;
radix2 =left + (right -left)/2;
}
}
}
if (sum > sum2) {
int radix2 = radix + 1;
while (sum >= sum2){
sum2 = 0;
for (int i =0; i <size2; i++) {
if(tran(n2[i])<radix2){
sum2 = sum2 + tran(n2[i]) * pow(radix2, size2-i-1);
}
}
if (sum2 == sum) {
result = radix2;
break;
}
radix2++;
}
}
return result;
}
int main() {
int tag, radix;
char n1[10], n2[10];
scanf("%s %s %d %d", &n1, &n2, &tag, &radix);
int size1 = 0, sum1=0,size2 = 0,xn=0;
//第一个字符长度和求和
for (int i = 0; i < 10; i++) {
if (n1[i] != '\0') {
size1++;
} else {
break;
}
}
//第二个字符长度
for (int i = 0; i < 10; i++) {
if (n2[i] != '\0') {
size2++;
} else {
break;
}
}
int realRadix2 = 0;
if (tag == 1) {
realRadix2 = getRadix(radix, n1, size1, n2, size2);
}
if (tag == 2) {
realRadix2 = getRadix(radix, n2, size2, n1, size1);
}
if (realRadix2 != 0) {
printf("%d", realRadix2);
} else {
printf("Impossible");
}
}
注:运行结果正确,但超时测试结果