1010 Radix (25分)

1010 Radix (25分)

首先注意进制数不只是我们平时常用的那几种
注意string类型转换成int类型

  1. 第一步:先判断出要查找的这个数的进制上下限,下限是该数最大的那个数,上限是两个数中最大的那个数的十进制数
  2. 第二步:二分查找,转换成十进制之后,如果该数小于已确定数,说明进制太小,如果大于或者为负数,则证明进制太大
    tips:单位数的时候从二进制依次往上找
  • rbegin()反向迭代器,begin()迭代器,用法都是固定的,记住就好
  • int isdigit(int) 参数是字符或ASCII码,判断是否是数字
  • *max_element(n.begin(),n.end()) 在区间内找极值
  • 标准文件中包含max()等函数
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;

// 将输入的string类型变量转换为十进制的数
long long convert(string n,long long radix){
    long long num=0;
    int i=0,temp;
    for(auto t=n.rbegin();t!=n.rend();t++){
        temp = isdigit(*t)? *t-'0':*t-'a'+10;
        num += temp*pow(radix,i++);
    }
    return num;
}

long long FindRadix(string n, long long num){
    char t = *max_element(n.begin(),n.end());
    long long low = (isdigit(t)?t-'0':t-'a'+10)+1;
    long long high = max(low,num);
    long long temp;
    while(low<=high){
        long long mid = (low+high)/2;
        temp = convert(n,mid);
        if(temp == num)return mid;
        else if(temp < 0 || temp > num)high=mid-1;
        else low=mid+1;
    }
    return -1;
}

int main(){
    string n1,n2;  // N1和N2不超过10位
    int tag;  // 取值为1或2,指定后面的进制对应的是哪一个数
    long long radix;  // 其中一个数的进制
    cin>>n1>>n2>>tag>>radix;
    
    long long result = tag==1?FindRadix(n2,convert(n1,radix)):FindRadix(n1,convert(n2,radix));
    if(result!=-1){
        cout<<result<<endl;
    }
    else{
        cout<<"Impossible"<<endl;
    }
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值