PAT 1010 Radix

题目描述

在这里插入图片描述

分析:

给出两个数,一个数的进制已知,寻找和这个数相等的另一个数的k进制,若是有多个k输出最小的一个。

把两个数都转换成十进制进行比较,寻找进制的时候采用二分查找的方法,二分查找的下限是已知进制数的最大的位数加1,上限是已知进制数的十进制数。

#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;

map<char,int> mp;
typedef long long ll;
ll change(char* s,ll radix){
    ll ans=0;
    for(int i=0;s[i]!='\0';i++){
        ans=ans*radix+mp[s[i]];
    }
    return ans;
}
ll findRadix(char* n1,char* n2,ll radix){
    ll left=-1,right=change(n1,radix);
    ll mid,k;
    ll num=right;
    for(int i=0;n2[i]!='\0';i++){
        left=max(left,(ll)mp[n2[i]]+1);
    }
    while(left<right){
        mid=left+(right-left)/2;
        k=change(n2,mid);
        if(k<0||k>=num){
            right=mid;
        }else if(k<num){
            left=mid+1;
        }
    }
    if(change(n2,left)!=num)
    {
        return -1;
    }
    else{
        return left;
    }
}
int main(){
    for(int i=0;i<36;i++){
        if(i<10){
            mp.insert(make_pair(i+'0',i));
        }
         else{
             mp.insert(make_pair(i-10+'a',i));
         }
    }
    char n1[15];
    char n2[15];
    ll tag,radix;
    scanf("%s %s %lld %lld",&n1,&n2,&tag,&radix);
    if(tag==1){
        radix=findRadix(n1,n2,radix);
    }
    else{
         radix=findRadix(n2,n1,radix);
    }
    if(radix==-1){
        printf("Impossible\n");
    }
    else{
        printf("%lld",radix);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值