#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
long long tag,radix;
long long num;
char n1[20],n2[20];
int findlargest(char x[])
{
int ans=0;
int len=strlen(x);
for(int i=0;i<len;i++)
{
int temp;
if (x[i]>='0'&& x[i]<='9') {temp=x[i]-'0';}
if (x[i]>='a'&& x[i]<='z') {temp=x[i]-'a'+10;}
ans=max(ans,temp);
}
return ans;
}
int charToInt(char x)//字符转数字
{
if('0'<=x&&x<='9')
return x-'0';
else
return x-'a'+10;
}
long long ten(char x[],int r)
{
int len=strlen(x);
long long ans=0;
for(int i=0;i<len;++i)
{
ans*=r;
ans+=charToInt(x[i]);
if(ans<0)
return -1;
}
return ans;
}
long long find(long long l,long long r)
{
long long m;
while(l<=r)
{
m=(l+r)/2;
long long temp=ten(n2,m);
if (temp==num){return m;}
if (temp>num||temp==-1) {r=m-1;}
else{l=m+1;}
}
return -1;
}
int main()
{
cin>>n1>>n2>>tag>>radix;
if (tag==2)
{
char x[20];
strcpy(x,n1);
strcpy(n1,n2);
strcpy(n2,x);
}
//int num;十进制下的数值
num=ten(n1,radix);
long long result;
long long low,high;
low=max(2,findlargest(n2)+1);
high=max(low,num)+1;
result=find(low,high);
if (result==-1){cout<<"Impossible";}
else{cout<<result;}
system("pause");
return 0;
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
long long tag,radix;
long long num;
char n1[20],n2[20];
int findlargest(char x[])
{
int ans=0;
int len=strlen(x);
for(int i=0;i<len;i++)
{
int temp;
if (x[i]>='0'&& x[i]<='9') {temp=x[i]-'0';}
if (x[i]>='a'&& x[i]<='z') {temp=x[i]-'a'+10;}
ans=max(ans,temp);
}
return ans;
}
int charToInt(char x)//字符转数字
{
if('0'<=x&&x<='9')
return x-'0';
else
return x-'a'+10;
}
long long ten(char x[],int r)
{
int len=strlen(x);
long long ans=0;
for(int i=0;i<len;++i)
{
ans*=r;
ans+=charToInt(x[i]);
if(ans<0)
return -1;
}
return ans;
}
long long find(long long l,long long r)
{
long long m;
while(l<=r)
{
m=(l+r)/2;
long long temp=ten(n2,m);
if (temp==num){return m;}
if (temp>num||temp==-1) {r=m-1;}
else{l=m+1;}
}
return -1;
}
int main()
{
cin>>n1>>n2>>tag>>radix;
if (tag==2)
{
char x[20];
strcpy(x,n1);
strcpy(n1,n2);
strcpy(n2,x);
}
//int num;十进制下的数值
num=ten(n1,radix);
long long result;
long long low,high;
low=max(2,findlargest(n2)+1);
high=max(low,num)+1;
result=find(low,high);
if (result==-1){cout<<"Impossible";}
else{cout<<result;}
system("pause");
return 0;
}
注意点(本题为PAT通过率最低的一题,有很多需要注意的地方)
1.注意本题进制有上限和下限(上限为已知进制数转换成的十进制数+1,下限为未知进制数中的最大数字)
2.注意判断溢出(主要是在未知进制数转换为十进制数的过程中,非常重要!!不进行这一步就要通过高精度来做了)
3.数据设置为Long long