1010. Radix (25)
参考了别人的代码,由于进制太大,可能会超出long long 所以要一个compare。
二分查找答案
#include <iostream>
#include <string.h>
using namespace std;
typedef long long LL;
LL str2Num(char * str, LL radix){
LL rst=0;
for(int i=0;str[i];i++){
rst*=radix;
if(str[i]>='a')
rst+=(str[i]-'a')+10;
else
rst+=(str[i]-'0');
}
return rst;
}
LL calcRadix(char * str){ //最低进制
int rst=-1;
for(int i=0;str[i];i++)
if(str[i]>='a')
rst=max(rst,(str[i]-'a')+10);
else
rst=max(rst,(str[i]-'0'));
return rst+1;
}
int compare(char* str, LL radix, LL target){
LL rst=0;
for(int i=0;str[i];i++){
rst*=radix;
if(str[i]>='a')
rst+=(str[i]-'a')+10;
else
rst+=(str[i]-'0');
if(rst>target)
return 1;
}
if(rst > target) return 1;
else if(rst<target) return -1;
else return 0;
}
LL binarySearch(char* B, LL low, LL high, LL target){
LL mid,val;
while(low<=high){
mid = (low+high)/2;
val=str2Num(B,mid);
int res = compare(B,mid,target);
if(res > 0)
high = mid-1;
else if(res<0)
low = mid+1;
else return mid;
}
return -1;
}
int main() {
char A[12],B[12];
int chose;
LL radix,res;
cin>>A>>B>>chose>>radix;
if(strcmp(A,"1")==0&&strcmp(B,"1")==0) printf("2\n");
else if(strcmp(A,B)==0) printf("%d\n",radix);
else{
if(chose==1){
LL target = str2Num(A,radix);
LL least = calcRadix(B);
res = binarySearch(B,least,max(target,least),target);
}
else{
LL target = str2Num(B,radix);
LL least = calcRadix(A);
res = binarySearch(A,least,max(target,least),target);
}
if(res==-1) cout<<"Impossible"<<endl;
else cout<<res<<endl;
}
return 0;
}