Radix
这道题能完全ac真的很难
我是参考这篇(http://blog.csdn.net/matrix_reloaded/article/details/35880933)慢慢调出来的,他说的注意概括的比较好,我不做赘述,就强调一点(不是二分搜索):3.算法剪枝(3)对应的函数就是cmp()。
这道题也让我认识到点改进算法的意义了。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
long long int ni;
long long int num(string s,long long int radix){
int i, ls=s.length();
long long int a=0,b=1;
for(i=ls-1;i>=0;i--){
int x;
if(s[i]>='0'&&s[i]<='9')
x=s[i]-'0';
else if(s[i]>='a')
x=s[i]-'a'+10;
a+=x*b;
b*=radix;
}
return a;
}
int cmp(string s,long long int radix){
int i, ls=s.length();
long long int a=0,b=1;
for(i=ls-1;i>=0;i--){
int x;
if(s[i]>='0'&&s[i]<='9')
x=s[i]-'0';
else if(s[i]>='a')
x=s[i]-'a'+10;
a+=x*b;
if(a>ni)
return 1;
b*=radix;
}
if(a==ni)
return 0;
return -1;
}
int maxNum(string s){
char a=s[0];
int ls=s.length();
for(int i=1;i<ls;i++){
if(a<s[i])
a=s[i];
}
if(a>='0'&&a<='9')
return a-'0';
else if(a>='a')
return a-'a'+10;
}
int main()
{
string a, b;
int tag;
long long int n1, n2, i,radix, radix2=0;
cin>>a>>b>>tag>>radix;
int maxnum;
bool judge=false;
if(a=="1"&&b=="1"){
cout<<2<<endl;
return 0;
}
if(a==b){
cout<<radix<<endl;
return 0;
}
if(tag==1){
n1=num(a,radix);
ni=n1;
maxnum=maxNum(b);
long long int f, l, m;
if(num(b,maxnum+1)<n1){
f=maxnum+1;
l=(maxnum+1)<n1?(n1):(maxnum+1);
while(f<=l){
m=(f+l)/2;
int res=cmp(b,m);
if(res==0){
radix2=m;
judge=true;
break;
}
else if(res==1){
l=m-1;
}else{
f=m+1;
}
}
}else if(num(b,maxnum+1)==n1){
judge=true;
radix2=maxnum+1;
}
}else{
n2=num(b,radix);
ni=n2;
maxnum=maxNum(a);
long long int f, l, m;
if(num(a,maxnum+1)<n2){
f=maxnum+1;
l=(maxnum+1)<n2?(n2):(maxnum+1);
while(f<=l){
m=(f+l)/2;
int res=cmp(a,m);
if(res==0){
radix2=m;
judge=true;
break;
}
else if(res==1){
l=m-1;
}else{
f=m+1;
}
}
}
else if(num(a,maxnum+1)==n2){
judge=true;
radix2=maxnum+1;
}
}
if(judge)
cout<<radix2<<endl;
else
cout<<"Impossible"<<endl;
return 0;
}