PAT甲级——1010 Radix——分数 25
题目

解法1
点击查看代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 将字符串 num 按 radix 进制转换为十进制数
long long convertToDecimal(const string& num, long long radix) {
long long result = 0;
for (char c : num) {
int digit = (c >= '0' && c <= '9') ? c - '0' : c - 'a' + 10;
result = result * radix + digit;
}
return result;
}
// 获取字符串 num 所能表示的最小进制(即其中最大字符的值+1)
long long getMinRadix(const string& num) {
char maxDigit = *max_element(num.begin(), num.end());
return ((maxDigit >= '0' && maxDigit <= '9') ? maxDigit - '0' : maxDigit - 'a' + 10) + 1;
}
// 二分查找适合的 radix 使得 targetValue == convertToDecimal(num, radix)
long long findRadix(const string& num, long long targetValue) {
long long low = getMinRadix(num);
long long high = max(low, targetValue + 1); // 取一个合理的 upper bound
while (low <= high) {
long long mid = low + (high - low) / 2;
long long converted = convertToDecimal(num, mid);
if (converted == targetValue) return mid;
if (converted < 0 || converted > targetValue) // 溢出或过大
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
int main() {
string N1, N2;
int tag;
long long radix;
cin >> N1 >> N2 >> tag >> radix;
string known = (tag == 1) ? N1 : N2;
string unknown = (tag == 1) ? N2 : N1;
long long targetValue = convertToDecimal(known, radix);
long long result = findRadix(unknown, targetValue);
if (result == -1)
cout << "Impossible" << endl;
else
cout << result << endl;
return 0;
}
一些心得
1、需要将两个数转化成同一进制的数,来比较。本题选择了十进制
2、在找目标进制时,使用了二分法,能加快速度
3、根据题意,进制是大于数字中的最大的那个数的
拓展
1、max_element
max_element 是 C++ 标准库
#include <iostream>
#include <vector>
#include <algorithm> // 需要包含这个头文件
using namespace std;
int main() {
vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
// 使用 max_element 找到最大元素的迭代器
auto maxIt = max_element(nums.begin(), nums.end());
// 输出最大值
cout << "最大值是: " << *maxIt << endl;
string s = "bcaezx";
char maxChar = *max_element(s.begin(), s.end());
cout << "最大字符是: " << maxChar << endl;
vector<int> nums = {3, -1, 4, -1, 5, -9, 2, 6, -5, 3};
// 自定义查找, 用lambda表达式定义规则,如按绝对值大小查找最大元素
auto maxIt = max_element(nums.begin(), nums.end(),
[](int a, int b) { return abs(a) < abs(b); });
cout << "绝对值最大的数是: " << *maxIt << endl;
return 0;
}
最大值是: 9
最大字符是: z
绝对值最大的数是: -9
2、二分查找(Binary Search)
二分查找是一种高效的查找算法,适用于有序数组 或 范围有界的搜索问题。它通过不断缩小搜索范围来查找目标值,时间复杂度为 O(log N),比线性查找(O(N))快得多。
// 二分查找
int binarySearch(const vector<int>& arr, int target) {
int low = 0, high = arr.size() - 1;
while (low <= high) {
int mid = low + (high - low) / 2; // 防止 (low + high) 溢出
if (arr[mid] == target)
return mid; // 找到目标,返回索引
else if (arr[mid] < target)
low = mid + 1; // 在右半部分查找
else
high = mid - 1; // 在左半部分查找
}
return -1; // 没找到
}
浙公网安备 33010602011771号