PAT A1010 Radix

戏子无情 提交于 2020-03-17 21:16:10

题目难度:三颗星
题目大意:给出两个数和 然后给出其中一个数的进制,要求计算出另一个数和该数相等的进制。
题目坑点:首先就是转换,根据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";
	
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!