Radix

  Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.

  Now for any pair of positive integers N​1​​ and N​2​​, your task is to find the radix of one number while that of the other is given.

Input Specification:

  Each input file contains one test case. Each case occupies a line which contains 4 positive integers:


N1 N2 tag radix

  Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a-z } where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number radix is the radix of N1 if tag is 1, or of N2 if tag is 2.

Output Specification:

  For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.

Sample Input 1:

6 110 1 10

Sample Output 1:

2

Sample Input 2:

1 ab 1 2

Sample Output 2:

Impossible

解题思路:
  本题给出两个数字n1、n2,给出其中一个数字tag的进制radix,要求判断是否存在某一进制可以使另一个数字与给定数字相等。

  为了方便运算,用字符串tn1、tn2记录输入的两个数字,字符串n1记录给定进制的数字,字符串n2记录未确定数字。用map<char, int > mp,记录每个字符所对应的数值,之后,可以先将给定进制的数字n1转化为10进制,n2的进制最小为其包含的最大数字+1记为leftn,且由于n2是整数,所以其进制最大不会超过n1的十进制与leftn中较大的一个+1,记为rightn。以leftn和rightn分别为左右边界二分所有进制,记mid为中点进制,将n2按mid进制转化为10进制与n1的十进制进行比较,如果n2较大证明mid取值过大,将rightn记为mid - 1;若小了,证明mid取值过小,leftn记为mid+1,若正好相等则找到答案。若无法找到某进制使得n1与n2相等,返回-1,如果返回的答案不为-1,输出答案,否则输出Impossible。

  AC代码

 #include<bits/stdc++.h>
using namespace std;
typedef long long LL;
map<char, LL> mp;
void init(){
for(char i = ''; i <= ''; i++){
mp[i] = i - ''; //初始化0 - 9
}
for(char i = 'a'; i <= 'z'; i++){
mp[i] = i - 'a' + ; //初始化a - z
}
}
LL toDecimal(string a, LL radix, LL maxn){ //转化为10进制的函数,所转化后的数不会超过给出的maxn
int len = a.size();
LL ans = ;
for(int i = ; i < len; i++){
ans = ans * radix + mp[a[i]];
if(ans < || ans > maxn){ //如果数据溢出了或超过上限
return -;//返回-1
}
}
return ans;//返回转化后的值
}
int cmp(string a, LL radix, LL n1){ //比较函数,用于比较n2的radix进制转化为10进制后与n1的十进制的大小
LL n2_10 = toDecimal(a, radix, n1);
//获得n2转化为10进制的值
if(n2_10 == n1) //如果n2的10进制与n1的十进制相同证明该进制是我们要获得的进制,返回0
return ;
else if(n2_10 < ) //如果toDecimal函数返回的n2小于0,证明n2在该进制下转化为十进制后大于n1的十进制
return ; //进制过大返回1
else if(n1 > n2_10) //如果n2在当前进制下转化为10进制小于n1的十进制
return -; //进制过小返回-1
else //否则返回1
return ;
}
LL getRadix(string a, LL leftn, LL rightn, LL n1){
//二分函数传入n2字符串,最小进制,最大进制,n1的十进制值
while(leftn <= rightn){
LL mid = (leftn + rightn) / ;
//获得中点
LL flag = cmp(a, mid, n1);
//判断终点进制n1与n2状态
if(flag == ) //若比较函数返回了0,证明在mid进制下n1与n2相等
return mid; //返回mid
else if(flag == -){ //进制过小
leftn = mid + ;
}else if(flag == ){ //进制过大
rightn = mid - ;
}
}
return -;
}
int getMaxNum(string a){ //获得n2中最大的数字
LL ans = -;
for(string::iterator it = a.begin(); it != a.end(); it++){
ans = max(ans, mp[*it]);
}
return ans;
}
int main(){
init(); //初始化mp
string tn1, tn2, n1, n2;
int tag, radix;
cin >> tn1 >> tn2 >> tag >> radix;
//输入 tn1 tn2 tag radix;
if(tag == ){
n1 = tn1;
n2 = tn2;
}else{
n1 = tn2;
n2 = tn1;
}
//n1记录已经确定进制的数字,n2记录未确定的数字
LL n1_10 = toDecimal(n1, radix, INT_MAX);
//将n1转化为10进制其上限为无穷大
LL leftn = getMaxNum(n2) + ;
//获得n2的最小进制
LL rightn = max(leftn, n1_10) + ;
//获得n2的最大进制
LL ans = getRadix(n2, leftn, rightn, n1_10);
//二分所有进制
if(tn1 == tn2)
printf("%d\n", radix);
else if(ans == -){
printf("Impossible\n");
}else{
printf("%lld\n", ans);
}
return ;
}

PTA (Advanced Level) 1010 Radix的更多相关文章

  1. PAT (Advanced Level) 1010. Radix (25)

    撸完这题,感觉被掏空. 由于进制可能大的飞起..所以需要开longlong存,答案可以二分得到. 进制很大,导致转换成10进制的时候可能爆long long,在二分的时候,如果溢出了,那么上界=mid ...

  2. PTA(Advanced Level)1036.Boys vs Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  3. PTA (Advanced Level) 1004 Counting Leaves

    Counting Leaves A family hierarchy is usually presented by a pedigree tree. Your job is to count tho ...

  4. PTA (Advanced Level) 1027 Colors in Mars

    Colors in Mars People in Mars represent the colors in their computers in a similar way as the Earth ...

  5. PTA (Advanced Level) 1020 Tree Traversals

    Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Given the ...

  6. PTA (Advanced Level) 1019 General Palindromic Number

    General Palindromic Number A number that will be the same when it is written forwards or backwards i ...

  7. PTA (Advanced Level) 1015 Reversible Primes

    Reversible Primes A reversible prime in any number system is a prime whose "reverse" in th ...

  8. PTA(Advanced Level)1025.PAT Ranking

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  9. PTA (Advanced Level)1035.Password

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

随机推荐

  1. java 封装返回json数据

    做的东西,一直是用easyui的,和后台的交互数据都是json格式的. 今天想要单独弄一个json数据返回给前台,其实是比较简单的问题,json接触不多,记录一下. 代码: public static ...

  2. 如何将本地数据库迁移至SQL Azure

    Windows Azure的SQL Azure和SQL Server 拥有不同的体系结构,可以说是两个不同的产品.SQL Azure不完全支持或者尚不支持SQL Server的某些功能,这使得我们不能 ...

  3. 基于ASP.NET生成二维码详细源码

    详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeakusing System; using ...

  4. 【转】Sql Server去除所有空格

    详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeak 1.普通空格: 前后的空格,使用LT ...

  5. django系列3.2--url的别名和反向解析 reverse

    命名URL和反向解析 在网页中某些要提交的地址等,需要改变的时候,此时网页过多,如果一个一个的去改,工作量巨大,这时就可以用到命名url,在html文件的模版中,只写命名,这样当需要我们改变urls. ...

  6. linux强制安装rpm包的命令

    rpm -ivh *********.rpm  --nodeps --force 强制安装会忽略掉所有依赖关系,强制进行安装

  7. 【文文殿下】Manache算法-学习笔记

    Manache算法 定义:是一个判断回文子串的算法,我们结合例题解释: 题目:给定一个长度为 n 的字符串 S,求其最长回文子串 一个字符串是回文的,当且仅当反转后的串与原串完全相等 分析:对于这个题 ...

  8. Linux之Ubuntu中的安装应用

    在Ubuntu中我们经常会使用apt install “APP name” 来安装需要的应用. 从图中我们可以看到,我们使用apt install map命令安装一个map小游戏,这个小游戏是一个用四 ...

  9. 2016级算法期末上机-D.简单·AlvinZH's Fight with DDLs I

    1117 AlvinZH's Fight with DDLs I 思路 简单题,动态规划. 本题与期末练习赛B题很相似,而且更为简单些.简化问题:在数字序列上取数,不能取相邻的数. DP数组定义,dp ...

  10. Vue 不睡觉教程3 - 来点实在的:自动计算剩余时间的任务列表

    目标前两课教的是入门和文件结构.都没有什么实在的东西.这次我们要来点实在的.我们要做出一个待办列表.这个待办列表有以下特点: 可以自动从文本中抽取出这件事情的开始时间可以显示当前距离这件事情的开始时间 ...