pat-1010 Radix (25)(迭代器,二分法,进制转换,代码详解)

题目链接

参考博客链接

博主的代码写的很漂亮,我还是花了挺久时间理解的,这里我写出了详细的解释说明

#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
long long convert(string n, long long radix) {//把n转换成十进制
    long long sum = 0;
    int index = 0, temp = 0;
    for (auto it = n.rbegin(); it != n.rend(); it++) {//未知迭代器类型故用auto
        temp = isdigit(*it) ? *it - '0' : *it - 'a' + 10;//isdigit():判断迭代器指向的内容是否是整数
        sum += temp * pow(radix, index++);//把n从当前radix进制转换成10进制
    }
    return sum;
}
long long find_radix(string n, long long num) {
    char it = *max_element(n.begin(), n.end());//找到要改变进制的n中最大的元素it,it是要搜索的进制的最小值,因为进制再小一点的话当前的最大元素就不会被显示了
    long long low = (isdigit(it) ? it - '0': it - 'a' + 10) + 1;//把it表示为10进制
    long long high = max(num, low);//进制的上界是不用改变进制的那个数的10进制表示数 和 要改变进制的n中最大的元素it的十进制表示数 中较大的那个
    while (low <= high) {//二分法查找合适的进制
        long long mid = (low + high) / 2;
        long long t = convert(n, mid);//将当前mid进制的n,转化为十进制的数t
        if (t < 0 || t > num) high = mid - 1;//t<0:t太大会溢出,t太大了:当前进制太大(这里自己根据sample手算一下就能理解)
        else if (t == num) return mid;
        else low = mid + 1;
    }
    return -1;
}
int main() {
    string n1, n2;
    long long tag = 0, radix = 0, result_radix;
    cin >> n1 >> n2 >> tag >> radix;
    result_radix = tag == 1 ? find_radix(n2, convert(n1, radix)) : find_radix(n1, convert(n2, radix));//tag = 1 :radix是n1的进制,要改变n2的进制,使它与radix进制的n1转换成的10进制的数相等
    if (result_radix != -1) {
        printf("%lld", result_radix);
    } else {
        printf("Impossible");
    }   
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzyhfxt/article/details/81836240