PAT甲级1010
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
long long ten(string n,long long r){
long long x=0;
for(int i=0;i<n.length();i++){
if(n[i]>='0' && n[i]<='9'){
x+=(n[i]-'0')*pow(r,(n.length()-1-i));
}else{
x+=(n[i]-'a'+10)*pow(r,(n.length()-1-i));
}
if(x<0){
return -1;
}
}
return x;
}
long long findr(string n,long long m){
long long max=0;
int lg=0;
for(int i=0;i<n.length();i++){
if(n[i]>='0' && n[i]<='9'){
if((n[i]-'0')>max){
max=n[i]-'0';
}
}else{
if((n[i]-'a'+10)>max){
max=n[i]-'a'+10;
}
}
}
max++;
long long low=max;
max=m+1;
long long mid;
if(low>max){
return -1;
}else{
while(max>=low){
mid=(low+max)/2;
if(ten(n,mid)>m || ten(n,mid)<0){
max=mid-1;
}else if(ten(n,mid)<m){
low=mid+1;
}else if(ten(n,mid)==m){
lg=1;
return mid;
}
}
}
if(lg==0){
return -1;
}
}
int main(){
string a;
string b;
int tag;
long long r;
long long m;
long long re;
cin>>a;
cin>>b;
cin>>tag;
cin>>r;
m=(tag==1?ten(a,r):ten(b,r));
re=(tag==1?findr(b,m):findr(a,m));
if(re==-1){
cout<<"Impossible";
}else{
cout<<re;
}
}
二分搜索!!!
数字范围,要用long long!!!
进制太大溢出的判断(两个地方!!!)
10进制溢出就直接Impossible!!!
上下界问题!!!
上界是另一个数字的10进制+1,举个例子:
输入 6 6 1 10
输出应该是7!!!因为7进制的6和10进制的6!!!都是6!!!
解题思路:
以字符串的形式存储两个数,将已知的数转化为10进制,判断上下界,利用二分法找到最终结果