这个题目本身也有问题,digit才最大36,radix居然可以达到sum+1、、、、
我自己的不对,参考这个http://blog.csdn.net/lv_zj/article/details/15810833
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <math.h>
using namespace std;
class CA
{
public:
enum{N=11};
void run();
private:
struct element
{
char inter[N];
int radix;
};
element *num1,*num2;
int findmax(char *p);
int tranchrtoint(char chr);
};
int CA::tranchrtoint(char chr)
{
if(chr<='9') return (chr-'0');
else return (chr-'a'+10);
}
int CA::findmax(char *p)
{
if(p==NULL)
return 0;
char max=0;
int i=0;
while(p[i]!='\0')
{
if(p[i]>max)
max=p[i];
i++;
}
return (tranchrtoint(max)+1);
}
void CA::run()
{
num1=new element;
num2=new element;
scanf("%s%s",&(num1->inter),&(num2->inter));
int tag;
double sum=0.0;
cin>>tag;
if(tag==1)
{
cin>>num1->radix;
int i=0;
while(num1->inter[i]!='\0')
{
if(num1->inter[i]>='0'&&num1->inter[i]<='9')
sum=sum*num1->radix+(num1->inter[i]-'0');
if(num1->inter[i]>='a'&&num1->inter[i]<='z')
sum=sum*num1->radix+(num1->inter[i]-'a'+10);
i++;
}
int j;
double jiashe=0.0;
num2->radix=-1;
double fi,fj,fmid;
fi=findmax(num2->inter);
fj=sum+1;
double tmp=-1;
while(fi<=fj)
{
fmid=floor((fi+fj)/2);
j=0;
while(num2->inter[j]!='\0')
{
if(num2->inter[j]>='0'&&num2->inter[j]<='9')
jiashe=jiashe*fmid+(num2->inter[j]-'0');
else if(num2->inter[j]>='a'&&num2->inter[j]<='z')
jiashe=jiashe*fmid+(num2->inter[j]-'a'+10);
j++;
}
if(jiashe-sum>0.5)
fj=fmid-1;
else if(sum-jiashe>0.5)
fi=fmid+1;
else
{
if(tmp<0||tmp-fmid>0.5)
tmp=fmid;
fj=fmid-1;
}
jiashe=0;
}
if(tmp<0)
printf("Impossible");
else
{
printf("%.0f",tmp);
}
}
if(tag==2)
{
cin>>num2->radix;
int i=0;
while(num2->inter[i]!='\0')
{
if(num2->inter[i]>='0'&&num2->inter[i]<='9')
sum=sum*num2->radix+(num2->inter[i]-'0');
if(num2->inter[i]>='a'&&num2->inter[i]<='z')
sum=sum*num2->radix+(num2->inter[i]-'a'+10);
i++;
}
int j;
double jiashe=0.0;
num1->radix=-1;
double fi,fj,fmid;
fi=findmax(num1->inter);
fj=sum+1;
double tmp=-1;
while(fi<=fj)
{
fmid=floor((fi+fj)/2);
j=0;
while(num1->inter[j]!='\0')
{
if(num1->inter[j]>='0'&&num1->inter[j]<='9')
jiashe=jiashe*fmid+(num1->inter[j]-'0');
else if(num1->inter[j]>='a'&&num1->inter[j]<='z')
jiashe=jiashe*fmid+(num1->inter[j]-'a'+10);
j++;
}
if(jiashe-sum>0.5)
fj=fmid-1;
else if(sum-jiashe>0.5)
fi=fmid+1;
else
{
if(tmp<0||tmp-fmid>0.5)
tmp=fmid;
fj=fmid-1;
}
jiashe=0;
}
if(tmp<0)
printf("Impossible");
else
{
printf("%.0f",tmp);
}
}
}
int main()
{
CA *a=new CA;
a->run();
return 0;
}