PAT (Advanced Level) 1010. Radix (25)

撸完这题,感觉被掏空。

由于进制可能大的飞起。。所以需要开longlong存,答案可以二分得到。

进制很大,导致转换成10进制的时候可能爆long long,在二分的时候,如果溢出了,那么上界=mid-1

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;

char s[15],t[15];
int tag;
long long radix;
long long num1,num2;

long long f(char *x,long long k)
{
    int len=strlen(x);
    long long ans=0;
    for(int i=0;x[i];i++)
    {
        ans=ans*k;
        if(x[i]>='0'&&x[i]<='9') ans=ans+x[i]-'0';
        else ans=ans+x[i]-'a'+10;
        if(ans<0) return -1;
    }
    return ans;
}

int main()
{
    scanf("%s%s%d%lld",s,t,&tag,&radix);
    if(tag==2) swap(s,t);
    int lens=strlen(s),lent=strlen(t);

    num1=f(s,radix);

    long long l=2,r=num1+1;

    for(int i=0;t[i];i++)
    {
        if(t[i]>='0'&&t[i]<='9') l=max(l,(long long)(t[i]-'0'+1));
        else l=max(l,(long long)(t[i]-'a'+10+1));
    }

    long long ans;
    bool flag=0;

    while(l<=r)
    {
        long long mid=(l+r)/2;
        long long num2=f(t,mid);

        if(num2<0) r=mid-1;
        else if(num1>num2) l=mid+1;
        else if(num1<num2) r=mid-1;
        else
        {
            ans=mid;
            flag=1;
            break;
        }
    }

    if(flag==1 ) printf("%lld
",ans);
    else printf("Impossible
");
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5496885.html