【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; }