PAT A1010 Radix
程序员文章站
2024-03-17 14:39:22
...
题目难度:三颗星
题目大意:给出两个数和 然后给出其中一个数的进制,要求计算出另一个数和该数相等的进制。
题目坑点:首先就是转换,根据tag把其中的一个已知的转换为十进制,然后再对另一个数进行二分的进制查找,查找很简单,问题就是两个数转换之后的对比,因为进制很大,范围很大,因此可能超过LL溢出,因此需要考虑溢出的情况,之前写都没有考虑,导致好多测试点都没通过,看了算法笔记之后,加了溢出的判断,就直接ac。。。。考虑不周全。
代码如下:
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
typedef long long LL;
using namespace std;
typedef struct{
int num[15]={0},len=0;
}Num;
Num to_Num(char a[],LL &maxnum){
Num n;
for(int i=0;i<strlen(a);i++){
if(a[i]<='9'){
n.num[i]=a[i]-'0';
}
else{
n.num[i]=a[i]-'a'+10;
}
if(n.num[i]>maxnum){
maxnum=n.num[i];
}
}
n.len=strlen(a);
maxnum++;
return n;
}
LL to_decimal(Num num,LL radix){
LL res=0;
for(int i=0;i<num.len;i++){
res=res*radix+num.num[i];
if(res<0)
return -1;
}
return res;
}
int main(){
char N1[15],N2[15];
LL tag,radix,max1=0,max2=0;//最大的digit
cin>>N1>>N2>>tag>>radix;
Num num1,num2,temp;
num1=to_Num(N1,max1);
num2=to_Num(N2,max2);
// cout<<max1<<" "<<max2<<endl;
if(tag==2){
temp=num1;num1=num2;num2=temp;
swap(max1,max2);
}
LL res=to_decimal(num1,radix);
LL left,right,mid,flag=0;
left=max2;
right=max(left,res)+1;
while(left<=right){
mid=(left+right)/2;
LL N2=to_decimal(num2,mid);
if(res==N2){
flag=1;
break;
}
else if(res<N2||N2<0){//之前没有考虑溢出也算是超过的情况
right=mid-1;
}
else{
left=mid+1;
}
}
if(flag==1)
cout<<mid;
else
cout<<"Impossible";
}
上一篇: 二分查找(函数实现)
下一篇: 小数的进制转换