注意几点:
1. 一定都要用Long long int,不然会错很多case;
2. 注意计算radix的值时,有可能会发生溢出,得到的result结果为负数,此时应该减少radix的值;
3. 不能使用简单的顺序搜索算法,应该使用二分法搜索;
除了只有一位数时候可能出现多个解,其余情况均只有一个解。
二分法搜索能够保证得到的结果唯一并且正确。
//1010. Radix (25)
//注意几点:
// 1. 一定都要用Long long int,不然会错很多case;
// 2. 注意计算radix的值时,有可能会发生溢出,得到的result结果为负数,此时应该减少radix的值;
// 3. 不能使用简单的顺序搜索算法,应该使用二分法搜索;
// 除了只有一位数时候可能出现多个解,其余情况均只有一个解。
// 二分法搜索能够保证得到的结果唯一并且正确。
#include <iostream>
#include <string.h>
#include <functional>
using namespace std;
long long int Cal(char c)
{
if (c >= '0' && c <= '9')
{
return (c -'0');
}
else
return (c - 'a' + 10);
}
long long int CalValueBaseRadix(char t[], long long int radix)
{
int i;
long long int result = 0;
for ( i = 0;i<strlen(t); i++)
{
result *= radix;
result += Cal(t[i]);
if (result < 0)
{
return -1;
}
}
return result;
}
int main(void)
{
#ifdef ONLINE_JUDGE
#else
freopen("D:\\1.txt", "r", stdin);
#endif
char a[15], b[15];
long long tag;
long long radixA, radixB;
scanf("%s %s %lld %lld", a, b, &tag, &radixA);
if (tag == 2)
{
//swap a and b
char tmp[15];
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
}
long long minRadix, maxRadix;
//value
long long i;
long long int valueA = CalValueBaseRadix(a, radixA);
minRadix = 0;
for (i = 0;i<strlen(b);i++)
{
if( Cal(b[i]) > minRadix)
minRadix = Cal(b[i]) + 1;
}
maxRadix = valueA + 1;
while(minRadix <= maxRadix)
{
//cal
radixB = (minRadix + maxRadix)/2;
long long int valueB = CalValueBaseRadix(b, radixB);
if (valueB == -1 || valueB > valueA)
{
maxRadix = radixB - 1;
}
else if (valueB < valueA)
{
minRadix = radixB + 1;
}
else if(valueA == valueB)
{
cout << radixB;
return 0;
}
}
cout << "Impossible";
return 0;
}