【PAT甲级】1010 Radix (25 分)(二分)

题意:

输入两个数可能包含小写字母,1或者2,进制大小。第三个数为代表第一个数是第四个数进制的,求第二个数等于第一个数时进制的大小,不可能则输出Impossible,第三个数为2代表第二个数是第四个数进制的,求第一个数等于第二个数时进制的大小,不可能则输出Impossible。数字的位数最多是十位。

trick:

进制可能很大,所以运算过程中可能会爆long long,不必担心,当成负数处理即可。

AAAAAccepted code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string s1,s2;
 4 long long t,rad;
 5 int main(){
 6     cin>>s1>>s2>>t>>rad;
 7     if(t==2)
 8         swap(s1,s2);
 9     long long num1=0,num2=0;
10     int len1=s1.size(),len2=s2.size();
11     for(int i=0;i<len1;++i){
12         num1*=rad;
13         if(s1[i]>='0'&&s1[i]<='9')
14             num1+=s1[i]-'0';
15         else
16             num1+=s1[i]-'a'+10;
17     }
18     int mx=0;
19     for(int i=0;i<len2;++i)
20         if(s2[i]>='0'&&s2[i]<='9')
21             mx=max(mx,s2[i]-'0');
22         else
23             mx=max(mx,s2[i]-'a'+10);
24     long long l=mx+1;
25     long long r=max(l,num1);
26     long long mid=0;
27     while(l<=r){
28         mid=(l+r)>>1;
29         string x=s2;
30         long long tmp=0;
31         for(int i=0;i<len2;++i){
32             tmp*=mid;
33             if(x[i]>='0'&&x[i]<='9')
34                 tmp+=x[i]-'0';
35             else
36                 tmp+=x[i]-'a'+10;
37         }
38         if(tmp>num1||tmp<0)//顺序写反会错
39             r=mid-1;
40         else if(tmp<num1)//顺序写反会错,因为溢出的话tmp小于0,一定小于num1
41             l=mid+1;
42         else{
43             cout<<mid;
44             return 0;
45         }
46     }
47     cout<<"Impossible";
48     return 0;
49 }

 

 

 

posted @ 2019-07-22 20:45  sewage  阅读(583)  评论(0编辑  收藏  举报