pat甲级打卡-1010 Radix

一道非常好的进制题
2个精华:x进制转10进制问题,二分问题

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;



LL get(string s,LL b){
    LL res=0;
    for(auto c:s){
        if(c>='a' && c-'a'+10>=b){ //检验值和进制是否合法,不能存在大于进制的字符
            return -1;
        }
        if(c<'a'){
            res=res*b+c-'0';
        }else{
            res=res*b+c-'a'+10;
        }
    }
    return res;
} 


//二分查找
LL bSearch(string s,LL val){
    //找左右边界
    char it=*max_element(s.begin(),s.end());//找最大字符值,进制数要大于它
    LL l=(isdigit(it) ? it - '0' : it - 'a' +10)+1;
    LL r=max(val,l);
    while(l<=r){
        LL mid=l+r>>1;
        LL t=get(s,mid);
        if(t<0 || t>val) r=mid-1;
        else if(t==val) return mid;
        else l=mid+1;   
    }
    return -1;
    
}


int main(){
    string n1,n2;
    int tag,radix;
    cin>>n1>>n2;
    cin>>tag>>radix;
    
    //cout<<get("bg07",32);
    //cout<<get(n2,2);
    if(tag==1){
        LL v1=get(n1,radix);
        LL b=bSearch(n2,v1);
        if(b!=-1) {printf("%lld",b);return 0;}
    }else{
        LL v1=get(n2,radix);
        LL b=bSearch(n1,v1);
        if(b!=-1) {printf("%lld",b);return 0;}
    }
    cout<<"Impossible";
    return 0;
}
posted @ 2022-04-29 23:07  秋月桐  阅读(22)  评论(0编辑  收藏  举报