题解:P12287 [蓝桥杯 2024 国 Java A] 进制判断

· · 题解

思路

枚举进制 2,4,8,16,如果按进制转换后依然小于等于 B_i 就记录答案,否则就跳过当前进制,计算下一个进制。

最后统计答案,如果存在唯一结果就输出这个数在 10 进制下的值,否则输出 -1。注意,如果有多个值,输出 -1

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, b;
string a;
ll zhuan(char s) {
    if (s>='0' && s<='9') return s-'0';//是2,4,8进制
    else if (s>='A' && s<='F') return s-'A'+10;//16进制
    else return -1;//不是所求进制
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n;
    while (n--) {
        cin>>a>>b;
        vector <ll>cnt;
        for (int x=2; x<=16; x*=2) {
            bool flag=1;
            ll ans=0;
            for (int j=0; j<a.size(); j++) {
                ll zz=zhuan(a[j]);
                if (zz==-1 || zz>=x) {
                    flag=0;
                    break;
                }//不符合当前进制x跳过
                if (ans*x+zz > b) {
                    flag=0;
                    break;
                }//超过了要求的b,先计算防溢出
                ans=ans*x+zz;//小于等于b,在范围内
            }
            if (flag==0) continue;
            cnt.push_back(ans);//记录符合要求的十进制a[i]
        }
        if (cnt.size()==1) cout<<cnt[0]<<"\n";
        else cout<<"-1\n";
    }
    return 0;
}