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

二分查找是一种高效的查找算法,适用于有序数组 或 范围有界的搜索问题。它通过不断缩小搜索范围来查找目标值,时间复杂度为 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; // 没找到
}

posted on 2025-03-03 10:20  LEESOL-cn  阅读(11)  评论(0)    收藏  举报

导航