1010 Radix (25 分)
这题什么范围都没,得自己看题目搞清楚范围在哪里,不用二分的话,测试点7会超时,还会有点小错误。正解是用二分写,上下界范围得注意。
#include <iostream>
using namespace std;
long long to_ten(string s, long long r){ // 转化为十进制
long long sum = 0;
for(int i = 0; i < s.length(); ++i) {
if (s[i] >= 'a')
sum = sum*r + (s[i] - 'a' + 10);
else
sum = sum*r + (s[i] - '0');
}
return sum;
}
int main() {
string x, y;
long long a, b, t, radix, f = 0, maxr = 0;
cin >> x >> y >> t >> radix;
if(t == 2)
swap(x, y);
a = to_ten(x, radix);
for(int i = 0; i < y.length(); ++i) {
if (y[i] >= 'a')
maxr = max(maxr, (long long)(y[i] - 'a' + 10));
else
maxr = max(maxr, (long long)(y[i] - '0'));
}
long long l = maxr + 1, r = max(maxr, a) + 1; //这个上下限很毒....
while( l <= r){
long long mid = (l + r) / 2;
b = to_ten(y, mid);
if(a < b || b < 0) // 溢出的话 b < 0
r = mid - 1;
else if (a > b)
l = mid + 1;
else{
f = mid; break;
}
}
if(f)
cout<<f;
else
cout<<"Impossible";
}