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\n",ans); else printf("Impossible\n"); return 0; }