A1010 Radix (25 分| 二分查找,附详细注释,逻辑分析)

写在前面
  • 思路分析
    • 进制转换函数 convert(n1, radix)
      • 给定1个数值和1个进制,将它转化为10进制
      • 转化过程中可能产生溢出
    • 等值查找进制函数 find_radix
      • 找到令两个数值相等的进制数
      • 在查找的过程中,需要使用2分查找算法
        • 使用当前进制转化得到数值比另1个大或小于0,说明这个进制太大或小
    • 20个测试点,-_-||
  • idea,涨知识!
测试用例
  • input:
    6 110 1 10
    
    output:
    2
    
    intput:
    1 ab 1 2
    
    output:
    Impossible
    
ac代码
  • 参考链接
  • #include <iostream>
    #include <cctype>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    // 进制转换函数,注意与转10进制的区别
    long long convert(string n, long long radix)
    {
        long long sum = 0;
        int index = 0, tmp = 0;
        for(auto it=n.rbegin(); it!= n.rend(); it++)
        {
            tmp = isdigit(*it) ? *it - '0' :
                  *it - 'a' + 10;
            sum += tmp*pow(radix, index++);
        }
        return sum;
    }
    
    // 进制转换函数,注意与转10进制的区别
    long long find_radix(string n, long long num)
    {
        char it = *max_element(n.begin(), n.end());
        // 最小进制
        long long low = (isdigit(it) ? it-'0' : it-'a'+10) + 1;
    
        // 最大进制
        long long high = max(num, low);
        while(low <= high)
        {
            long long mid = (low+high) / 2;
            long long t = convert(n, mid);
            if(t<0 || t>num) high = mid - 1;
            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));
        if(result_radix != -1)
            printf("%lld", result_radix);
        else
            printf("Impossible");
    
        return 0;
    }
    
知识点小结
  • max_element / min_element 函数
    • 可用类型
      • vector<int>
      • vector<string>
      • int arr[4]
      • string arr[4]
      • 也可用于结构体vector或结构体数组
    #include <iostream>
    #include <algorithm>
    using namespace std;
    struct node
    {
        int x, y;
    };
    bool cmp1(node a, node b)
    {
        return a.x > b.x;
    }
    
    int main()
    {
        string ss = "kngines";
        cout << "org ss: " << ss << endl;
        cout << "reverse ss: ";
        for(auto it=ss.rbegin(); it!=ss.rend(); it++)
            cout << *it;
        cout << endl;
    
        // 字符串最大元素
        ss = "123abc456";
        char ch = *max_element(ss.begin(), ss.end());
        cout << "max digit char: " << ch << " ,isdigit: " << isdigit(ch) << endl;
    
        vector<int> v = {3,7,2,5,6,4,9};
        int arr[] = {3,7,2,5,6,4,9};
        vector<node> v1(3);
    
        // 容器数组中最大元素
        cout << *max_element(v.begin(), v.end()) << endl;
    
        // 最小元素
        cout << *min_element(arr, arr + 7) << endl;
    
        // 结构体最大元素
        cout << (*max_element(v1.begin(), v1.end(), cmp1)).y;
    
        return 0;
    }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xsimah

创作不易,感谢客官的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值