欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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";
	
}

相关标签: PAT Advanced