该问题的关键有几点:
(1)N1,N2长度是10为数字,用int类型会越界,long类型同样是32字节的,所以也不行,可以统一用double类型,但注意浮点型比较大小是不能直接用==、>、<。
(2)radix2如果直接从小打到遍历会超时,所以需要用二分法。
#include <stdio.h>
#include <string.h>
#include <math.h>
class A
{
public:
enum{digit_len=11};
void run();
private:
int getminradix(char *ps);
double getradixfnum(char *ps,double fradix);
int tranchrtoint(char chr);
char digit1[digit_len],digit2[digit_len];
int tag,radix;
};
int A::tranchrtoint(char chr)
{
if(chr<='9') return (chr-'0');
else return (chr-'a'+10);
}
int A::getminradix(char *ps)
{
if(ps==NULL) return 0;
char max=0;
int i=0;
while(ps[i]!='\0')
{
if(ps[i]>max) max=ps[i];
i++;
}
return (tranchrtoint(max)+1);
}
double A::getradixfnum(char *ps,double fradix)
{
int len=strlen(ps),i=len-1,k;
double fnum=0,j=1;
while(i>=0)
{
k= tranchrtoint(ps[i]);
fnum+=k*j;
j*=fradix;
i--;
}
return fnum;
}
void A::run()
{
scanf("%s%s%d%d",digit1,digit2,&tag,&radix);
char *ps1,*ps2;
if(tag==1)
{
ps1=digit1;
ps2=digit2;
}
else
{
ps1=digit2;
ps2=digit1;
}
double radix1,radix2,f1,f2,fi,fj,fmid,minr2=-1;
radix1=radix;
radix2=getminradix(ps2);
f1=getradixfnum(ps1,radix1);
fi=radix2;
fj=radix2>f1+1?radix2+1:f1+1;
while(fi<=fj)
{
fmid=(fi+fj)/2;
fmid=floor(fmid);
f2=getradixfnum(ps2,fmid);
if(f1-f2>0.5) fi=fmid+1; //f1>f2
else if(f2-f1>0.5) fj=fmid-1; //f2>f1
else
{
if(minr2<0||minr2-fmid>0.5)
{
minr2=fmid;
}
fj=fmid-1;
}
}
if(minr2<0)
{
printf("Impossible");
}
else
{
printf("%.0f",minr2);
}
}
int main()
{
// freopen("test.in","r",stdin);
A *a=new A;
a->run();
return 0;
}