zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    Vue
    Vue
    Vue
    Vue
    Vue
    kubernetes
    kubernetes
    kubernetes
    django源码bug解决方案
    UNI-APP 桌面LOGO角标设置(ios)
  • 原文地址:https://www.cnblogs.com/Andrew-aq/p/13124528.html
Copyright © 2011-2022 走看看