【PAT】1010 Radix (25 分)

该博客主要探讨了一种将字符串在不同进制间转换的方法,并实现了一个二分查找算法来确定未知进制的字符串表示。代码示例中展示了如何从给定的十进制数或特定进制数出发,寻找另一个字符串的合适进制,使得两个数相等。这个过程涉及到字符串处理、数学运算以及二分查找策略。
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;

long long radix_transform(string a,long long radix){//先把能确定的a数转成十进制,方便比较
  long long res=0;
  reverse(a.begin(),a.end());
  for(int i=0;i<a.size();i++){
    if(a[i]>='0'&&a[i]<='9')      res+=((a[i]-'0')*pow(radix,i));
    else if(a[i]>='a'&&a[i]<='z') res+=((a[i]-'a'+10)*pow(radix,i));
  }
  return res;
}

long long find_radix(string b,long long res){//现在b的进制未知,最好二分查找
  char it=*max_element(b.begin(),b.end());//找到b最大数位
  long long low=(isdigit(it)?it-'0':it-'a'+10)+1;//b数的最小进制通过b数的最大数位判断
  long long high=max(res,low);//考虑到a,b本身的进制大小问题,a的最大进制和b数最小进制中的最大值

//b数的数位限制了b数最少是现在的进制
//为了与a数相等,b数最多是a的最大进制

//当前进制(权)太大了:cur_num>res,正确进制在左边
//当前进制(权)太小了:cur_num<res,正确进制在右边
//但是此题long long仍然不够存,进制太大可能溢出,cur_num<0

  while(low<=high){
    long long mid=(low+high)/2;
    long long cur_num=radix_transform(b,mid);
    if(cur_num==res){
      return mid;
    }else if(cur_num>res || cur_num<0){
      high=mid-1;
    }else{
      low=mid+1;
    }
  }
  return -1;
}

int main() {
  string N1,N2;
  long long tag,radix;
  cin>>N1>>N2>>tag>>radix;

  long long res_radix;
  if(tag==1){
    res_radix=find_radix(N2,radix_transform(N1,radix));
   
  }else{
    res_radix=find_radix(N1,radix_transform(N2,radix));
  }
  
  if(res_radix==-1) printf("Impossible");
  else              printf("%lld",res_radix);

  return 0;
}
//其实不用倒转容器
long long transformRadix(string num,long long radix){//先把能确定的转成十进制
  long long res=0;
  for(int i=num.length()-1;i>=0;i--){
    if(num[i]>='0'&&num[i]<='9')      res+=((num[i]-'0')*pow(radix,num.length()-i-1));
    else if(num[i]>='a'&&num[i]<='z') res+=((num[i]-'a'+10)*pow(radix,num.length()-i-1));
  }

  return res;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值