PAT (Advanced Level) 1010 Radix (25 分)

本文介绍了一种解决特定进制转换问题的方法,通过确定进制范围并使用二分查找来避免超时,同时讨论了如何判断溢出情况,确保算法的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题的坑主要有下面几点:
1、进制上界根据所给数的十进制大小确定,下界由最大数位决定。
2、使用二分防止超时。
3、二分时注意判断查找结果是否溢出(从某一进制转换为10进制时可能发生溢出)

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
string n1,n2;
int tag;
ll radix;

// 转换为10进制
ll todecimal(string num,ll tag){
	ll res=0;
	for(int i=0;i<num.size();i++){
		if(num[i]>='0' && num[i]<='9'){
			res = res*tag+num[i]-'0';
		}else if(num[i]>='a' && num[i]<='z'){
			res = res*tag+num[i]-'a'+10;
		}
	}
	return res;
}
// 二分查找
ll findradix(ll low,ll high,ll res){
	while(low<=high){
		ll mid = (low+high)/2;
		ll temp = todecimal(n2,mid);
		if(temp == res) return mid;
		else if(temp>res || temp<0){ //判断溢出 
			high = mid-1;	
		}else{
			low = mid+1;
		}
	}
	return 0;
}

int main(){
	cin>>n1>>n2; 
	scanf("%d %lld",&tag,&radix);
	if(tag == 2){
		swap(n1,n2);
	}
    ll minnum=0; // 查找最小下界
    for(int i=0;i<n2.size();i++){
        if(n2[i]>='0' && n2[i]<='9' && n2[i]-'0'>minnum) minnum = n2[i]-'0';
        else if(n2[i]>='a' && n2[i]<='z' && n2[i]-'a'+10>minnum) minnum = n2[i]-'a'+10;
    }
    ++minnum;
	ll c1 = todecimal(n1,radix); 
	ll resradix = findradix(minnum,c1+1,c1); 
	if(resradix){
		printf("%lld\n",resradix); 
	}else{
		printf("Impossible\n");
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值