PAT1010

#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;

}

注意点(本题为PAT通过率最低的一题,有很多需要注意的地方)

1.注意本题进制有上限和下限(上限为已知进制数转换成的十进制数+1,下限为未知进制数中的最大数字)

2.注意判断溢出(主要是在未知进制数转换为十进制数的过程中,非常重要!!不进行这一步就要通过高精度来做了)

3.数据设置为Long long 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值