1010 Radix (25分)

题目大意:给出两个数N1、N2,再给出一个tag和radix,若tag为1,表示N1为radix进制数,否则N2为radix进制数。求对于另一个数,是否存在某一进制使得两数相等。

思路:题目本身并不难,但是坑点巨多。题目所给的数中,每位上最小为0,最大为z表示35,但是进制可能会非常大,所以需要通过long long来存数,同时通过二分来判断是否有正确的答案存在。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>

using namespace std;

typedef long long LL;

LL tran(string s,LL r){
    reverse(s.begin(),s.end());

    LL res=0,wei=1;
    for(int i=0;i<(int)s.length();i++){
        res+=(isdigit(s[i])? s[i]-'0':s[i]-'a'+10)*wei;
        wei*=r;
    }

    return res;
}

int main(){
    string a,b,tem;
    LL tag,ra,num;

    cin>>a>>b>>tag>>ra;
    if(tag==1){
        num=tran(a,ra);
        tem=b;
    }
    else{
        num=tran(b,ra);
        tem=a;
    }

    int lim=0;
    for(int i=0;tem[i];i++)
        if(isdigit(tem[i])) lim=max(lim,tem[i]-'0');
        else lim=max(lim,tem[i]-'a'+10);
    LL l=lim+1,r=max(l,num);
    while(l<=r){
        LL mid=(l+r)/2;
        LL tmp=tran(tem,mid);
        if(tmp==num){
            printf("%lld\n",mid);
            return 0;
        }
        if(tmp>num||tmp<0) r=mid-1;
        else l=mid+1;
    }
    printf("Impossible\n");

    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值