zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    2月3日
    照片测试
    家属签证计时
    我来了
    090204 阴天
    重要提醒to 小爱
    小毛小毛
    C++Primer学习日程
    资料库字段存储文件记录的方式
    本日有点忙
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5496885.html
Copyright © 2011-2022 走看看