1. 程式人生 > >1010 Radix - 進位制轉換(有坑)

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");
}