PAT 甲级1010 Radix (25分)

Posted andrew-aq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 甲级1010 Radix (25分)相关的知识,希望对你有一定的参考价值。

题意:给一个已知进制的数N1,问另一个数N2是否存在某一进制表示和N1相等。

思路(debug历程):将N1转化成10进制数,枚举进制计算N2,与N1进行比较。

先开始想到的是从2开始向上枚举到36,后来发现36不对。发现枚举上界应该是N1+1(这个看网上的证明吧https://blog.csdn.net/qq_37613112/article/details/91387345

然后又发现超时,需要二分答案,还是不对。

因为进制转化出来的数会爆int,应该用longlong。

还是有两个测试点错误。改了下界为N2中最大数+1就AC了。(因为比如N2中存在2,进制必须大于2才有意义,不然肯定会出什么bug)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll radixTrans(char arg[],ll k)
{
    ll res=0,base=1;
    ll len=strlen(arg);
    for(ll i=0;i<len;i++)
    {
        char c_num=arg[len-i-1];
        ll num;
        if(c_num>=0&&c_num<=9) num=c_num-0;
        else num=c_num-a+10;
        res+=num*base;
        base*=k;
    }
    return res;
}
int getMaxValue(char arg[])
{
    ll len=strlen(arg);
    ll maxa=0,num;
    for(ll i=0;i<len;i++)
    {
        char c_num=arg[len-i-1];
        if(c_num>=0&&c_num<=9) num=c_num-0;
        if(num>maxa) maxa=max(num,maxa);
    }
    return maxa;
}
char num[2][15];

int main()
{
    ll tag,radix;
    ll n1,n2;
    cin>>num[0]>>num[1]>>tag>>radix;
    ll t=tag-1;
    n1=radixTrans(num[t],radix);
    ll l=getMaxValue(num[t^1])+1;
    ll r=n1+1,mid;
    ll flag=0;
    while(l<=r)
    {
        mid=l+((r-l)>>1);
        n2=radixTrans(num[t^1],mid);
        if(l==mid && n1==n2){
            flag=1;
            break;
        }
        if(n2>n1||n2<0) r=mid-1;
        else if(n2<n1) l=mid+1;
        else l=mid;
    }
    if(flag==1) cout<<l<<endl;
    else cout<<"Impossible"<<endl;
    return 0;
}

 

以上是关于PAT 甲级1010 Radix (25分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT甲级 1010 Radix

PAT甲级 1010 Radix

PAT甲级1010

PAT 甲级 1010 Radix

PAT 1010 Radix (25分) radix取值无限制,二分法提高效率

PAT 甲级测试题目 -- 1010 Radix