PAT (甲级) 1010 Radix

题目

题目链接

代码
#include <iostream>
#include <string>
using namespace std;
long long int trans(string& s, int radix){
    long long int total = 0;
    for(int i=0; i<s.size(); ++i){
        if(s[i]>='0' && s[i]<='9'){
            total = total*radix  + (s[i] - '0');
        }
        else{
			total = total*radix + (s[i]-'a'+10);
        }
    }
    return total;
}
//二分查找
int find(string& s, long long int total, int leftRadix, int rightRadix){
    if(leftRadix == rightRadix && trans(s, leftRadix) != total){
        return -1;
    }
    int midRadix = (leftRadix + rightRadix)/2, ans = 0;
    long long int num =  trans(s,midRadix);
    if( num == total){
        ans =  midRadix;
    }
    else if(num < total){
        leftRadix = midRadix;
        ans = find(s,total,leftRadix,rightRadix);
    }
    else{
        rightRadix = midRadix;
        ans = find(s,total,leftRadix,rightRadix);
    }
    return ans;
}
int main(){
    string s1, s2, s3;
    int a, b;
    long long int total1 = 0;
    cin >> s1 >> s2 >> a >> s3;
	if(s3[0]>='0' && s3[0]<='9') b = stoi(s3);
	else b = s3[0] - 'a' + 10;
    //始终保持s1 的进制已知,如果不知,则交换s1和s2
    if(a == 2) swap(s1,s2);
    //求出s1的值
    total1 = trans(s1, b);
    //确定s2中最大的字符
    char maxChar = '0';
    for(int i=0; i<s2.size(); ++i){
        if(s2[i] >maxChar) maxChar = s2[i];
    }
    int leftRadix=0, rightRadix = 36, midRadix = 0;
    //根据最大的字符确定最小的进制,从最小进制开始进行二分查找
    if(maxChar>='0' && maxChar<='9') leftRadix = maxChar - '0' + 1;
    else leftRadix = maxChar - 'a' + 11;
    int res;
    //如果满足要求才进行二分查找
    if(trans(s2,leftRadix) <= total1 && trans(s2, rightRadix) >= total1)
        res = find(s2,total1,leftRadix,rightRadix);
    else res = -1;
    if(res != -1) cout << res;
    else cout << "Impossible";
    return 0;
}
#include <iostream>
#include <string>
using namespace std;
long long int trans(string& s, int radix){
    long long int total = 0;
    for(int i=0; i<s.size(); ++i){
        if(s[i]>='0' && s[i]<='9'){
            total = total*radix  + (s[i] - '0');
        }
        else{
			total = total*radix + (s[i]-'a'+10);
        }
    }
    return total;
}
int main(){
    string s1, s2, s3;
    int a, b;
    long long int total1 = 0;
    cin >> s1 >> s2 >> a >> s3;
	if(s3[0]>='0' && s3[0]<='9') b = stoi(s3);
	else b = s3[0] - 'a' + 10;
    //始终保持s1 的进制已知,如果不知,则交换s1和s2
    if(a == 2) swap(s1,s2);
    //求出s1的值
    total1 = trans(s1, b);
    //确定s2中最大的字符
    char maxChar = '0';
    for(int i=0; i<s2.size(); ++i){
        if(s2[i] >maxChar) maxChar = s2[i];
    }
    int leftRadix=0, rightRadix = 36, midRadix = 0;
    //根据最大的字符确定最小的进制,从最小进制开始进行二分查找
    if(maxChar>='0' && maxChar<='9') leftRadix = maxChar - '0' + 1;
    else leftRadix = maxChar - 'a' + 11;
    int res;
    //如果满足要求才进行二分查找
    if(trans(s2,leftRadix) > total1){
        res = -1;
    }
    else{
        for(int i=leftRadix; i<=rightRadix; ++i){
            long long int num = trans(s2,i);
            if(num == total1){
                res = i;
                break;
            }
        }
    }
    if(res != -1) cout << res;
    else cout << "Impossible";
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值