PAT 甲级 1010 Radix
这道题还没AC,先记录一下,二分哪里写错了,测试点十还没过。
更新:AC了,测试点十的问题是beg和end爆int,改成long long就好了。
#include <bits/stdc++.h>
using namespace std;
// 0~9映射为0~9,a~z映射为10~35
int Map(char r)
{
if (r <= '9' && r >= '0')
return r - '0';
else if (r <= 'z' && r >= 'a')
return r - 'a' + 10;
return -1;
}
long long ToRadix10(const string& s, int radix)
{
long long ans = 0;
for (int i = 0; i < s.size(); ++i) {
ans = ans * radix + Map(s[i]);
}
return ans;
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
string N1, N2;
int tag, radix;
cin >> N1 >> N2 >> tag >> radix;
if (tag == 2) std::swap(N1, N2);
// 把N1换成十进制
long long N1_10 = ToRadix10(N1, radix);
// 找到N2中的最大数字m;
int m = -1;
for (int i = 0; i < N2.size(); ++i) {
m = std::max(m, Map(N2[i]));
}
// 遍历,除了测试点七都能过
// int radix_to_find;
// for (radix_to_find = m + 1; radix_to_find <= 50; ++radix_to_find) {
// // 计算M进制下的N2的十进制表示
// long long N2_10 = ToRadix10(N2, radix_to_find);
// if (N2_10 == N1_10) {
// cout << radix_to_find;
// return 0;
// }
// }
// 二分搜索AC,是不重复元素的二分
long long beg = m + 1, mid;
long long end = std::max(N1_10, beg);
long long N2_10;
while (beg <= end) {
mid = beg + (end - beg) / 2;
N2_10 = ToRadix10(N2, mid);
if (N2_10 == N1_10) {
cout << mid;
return 0;
}
if (N2_10 > N1_10 || N2_10 <= 0) { // 后面一个条件是防止溢出
end = mid - 1;
}
else {
beg = mid + 1;
}
}
cout << "Impossible";
return 0;
}