PAT1010 Radix(进制转换)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37360631/article/details/88652088

分析:给定一对正整数,例如6和110,这个等式6 = 110是否为真?答案是“是”,如果6是十进制数,110是二进制数的话。现在对于任意一对正整数N1和N2,你的任务是找到一个数字的进制,而另一个数字的进制是给定的。

分析:修改了一下,现在是24/25
(1)首先确定让你判断的数的进制,它的下限应该是自身每一位最大值再加1,比如2d34,那么进制的下限就应该是d+1也就是14.这个数进制的上限就是另外一个数的大小。
(2)然后二分这个区间 [ m i n R a d i x , m a x R a d i x ] [minRadix,maxRadix] ,判断这两个数是否相等。
(3)注意:范围可能非常的大,开unsigned long long

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
string s1,s2;
ull n1,n2,tag,radix;
ull tran(string s,ull q){
    ull len=s.length();
    ull tmp=0;
    for(ull i=0;i<len;i++){
        if(s[i]>='0'&&s[i]<='9') {tmp=tmp*q+s[i]-'0';}
        else if(s[i]>='a'&&s[i]<='z') {tmp=tmp*q+s[i]-'a'+10;}
    }
    return tmp;
}

void solve(string s,ull num){
    ull len=s.length();
    ull lowRadix=1;
    ull maxRadix=num;
    bool flag=false;
    for(ull i=0;i<len;i++){
        ull x=-1;
        if(s[i]>='0'&&s[i]<='9'){x=s[i]-'0';}
        else if(s[i]>='a'&&s[i]<='z') {x=s[i]-'a'+10;}
        lowRadix=max(x,lowRadix);
    }
    lowRadix++;                 //得到这个数的进制下限
    maxRadix=num;                //得到这个数的上限,就是另外的那个数

    ull l=lowRadix;
    ull r=maxRadix;
    ull mid=-1;
    while(l<=r){
        mid=(l+r)/2;
        if(tran(s,mid)<num){l=mid+1;}
        else if(tran(s,mid)>num) {r=mid-1;}
        else {flag=true;break;}
    }

    if(!flag) cout<<"Impossible"<<endl;
    else{
        cout<<mid<<endl;
    }
}
int main(){
    std::ios::sync_with_stdio(false);
    cin>>s1>>s2;
    cin>>tag>>radix;
    if(tag==1){
        n1=tran(s1,radix);
        solve(s2,n1);
    }
    else{
        n2=tran(s2,radix);
        solve(s1,n2);
    }
    return 0;
}



得分10/25,明天补。

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int n1,n2,tag,radix;
int tran(string s,int q){
    int len=s.length();
    int tmp=0;
    for(int i=0;i<len;i++){
        if(s[i]>='0'&&s[i]<='9') {tmp=tmp*q+s[i]-'0';}
        else if(s[i]>='a'&&s[i]<='z') {tmp=tmp*q+s[i]-'a'+10;}
    }
    return tmp;
}

void solve(string s,int num){
    int len=s.length();
    int ans=0;
    bool flag=false;
    int cur=0;
    char ch;
    for(int i=0;i<=35;i++){
        ans=tran(s,i);
        if(ans==num){
            flag=true;
            cur=i;
            break;
        }
    }
    if(cur>10){ch=cur-11+'a';}
    if(!flag) cout<<"Impossible"<<endl;
    else{
        if(cur>10) cout<<ch<<endl;
        else cout<<cur<<endl;
    }
}
int main(){
    cin>>s1>>s2;
    cin>>tag>>radix;
    if(tag==1){
        n1=tran(s1,radix);
        solve(s2,n1);
    }
    else{
        n2=tran(s2,radix);
        solve(s1,n2);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/88652088