1010 Radix - 进制转换(有坑)

思路:

这题有坑啊

(1)z表示36并不意味着只到36进制,最小2进制,最大进制=另一个数的值

(2)可能会超时,用二分

(3)用long long!在二分过程中会溢出,所以要特判,当溢出时说明书过大,right=mid-1

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
const int N=1005;

ll to_num(char c){
    if(c>='0'&&c<='9')return c-'0';
    else return c-'a'+10;
}

ll tra(string s,ll r){//把r进制的x转成10进制
    int len=s.length();
    ll res=0,tmp=1;
    for(int i=len-1;i>=0;i--){
        res+=tmp*to_num(s[i]);
        if(res<0||tmp<0)return -1;
        tmp=tmp*r;
    }
    return res;
}

int main(){
    int tag,r;
    string a,b;
    ios::sync_with_stdio(false);
    cin>>a>>b>>tag>>r;
    if(tag==2)swap(a,b);
    ll numa=tra(a,r);//把r进制的a转换成10进制
    ll left=2,right=numa+1;
    for(int i=0;i<b.length();i++){
        left=max(left,to_num(b[i])+1);
    }
    while(right>=left){
        ll mid=(left+right)>>1;
        ll t=tra(b,mid);
        if(t==-1||t>=numa)right=mid-1;
        else left=mid+1;
    }
    if(tra(b,left)==numa)printf("%lld\n",left);
    else printf("Impossible\n");
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/83065054