解题思路:
题目思路其实很简单, 转成十进制比大小即可,但是题中数据范围没有给,需要考虑到溢出等很多细节:
1.要算的基数应大于等于该数的每位数中的最大值加一。
2.在计算途中出现溢出要单独考虑。
3.尽量用long long保存数据,我一开始用int型导致一直有几个测试点过不去。
4.在查找基数时用二分, 不然会超时。
C++代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//转化为10进制的函数
long long getNum(char str[], int radix)
{
long long num = 0;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(str[i] >= '0' && str[i] <= '9')
{
num = num * radix + str[i] - '0';
}
else
{
num = num * radix + str[i] - 'a' + 10;
}
}
return num;
}
int main()
{
char num1[11], num2[11];
int tag, radix1;
while(scanf("%s %s %d %d", num1, num2, &tag, &radix1) != EOF)
{
if(tag == 2)
{
char num[11];
strcpy(num, num2);
strcpy(num2, num1);
strcpy(num1, num);
}
long long c1 = getNum(num1, radix1);
//以下获取数据2所需的最小进制
int radix2 = 1;
int len2 = strlen(num2);
for(int i = 0; i < len2; i++)
{
if(num2[i] >= '0' && num2[i] <= '9')
{
if(num2[i] - '0' > radix2)
{
radix2 = num2[i] - '0';
}
}
else
{
if(num2[i] - 'a' + 10 > radix2)
{
radix2 = num2[i] - 'a' + 10;
}
}
}
radix2++; //记得加1
long long l = radix2, r = c1 + 1, mid;
radix2 = -1;
//二分查找对应基数
while(l <= r)
{
mid = (l + r) / 2;
long long c2 = getNum(num2, mid);
if(c2 == c1)
{
radix2 = mid;
break;
}
else if(c2 > c1 || c2 < 0) // c2小于零 必溢出
{
r = mid - 1;
}
else
{
l = mid + 1;
}
}
if(radix2 == -1)
{
printf("Impossible\n");
}
else
{
printf("%d\n", radix2);
}
}
}