题目

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 N1 and N2, 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

题目分析

已知两个数(最多有10位),其中一个数的基数,求使两个数相等的另一个数的基数,

解题思路

  1. 二分查找,寻找另一个数的基数,使得两个数字十进制相等

易错点

  1. 已知数字最多有10位,如果基数大于10,可能会超过int范围,需要使用long long
  2. 暴力枚举会超时,需要使用二分查找
  3. 未知基数数字的进制,下界为所有数位中最大数+1,上界为max(基准数十进制,下界)(如:100000 10第一个数字基数为10,第二个数字基数为1000000也能使两个数相等)
  4. 未知基数的数字转换为10进制后,可能溢出(为负值),表示基数太大要high=w(若没有该判断,测试点:10 12 13 15 16 6 8会错误)

知识点

  1. 任意进制转换为十进制
long long conver_radix(long long radix,string vs) {
long long ans = 0,index=0;
for(int i=vs.length()-1; i>=0; i--) {
int temp=isdigit(vs[i])?vs[i]-'0':vs[i]-'a'+10;
ans += temp*pow(radix,index++);
}
return ans;
}

Code

Code 01

#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
#include <climits>
using namespace std;
long long conver_radix(long long radix,string vs) {
long long ans = 0,index=0;
for(int i=vs.length()-1; i>=0; i--) {
int temp=isdigit(vs[i])?vs[i]-'0':vs[i]-'a'+10;
ans += temp*pow(radix,index++);
}
return ans;
}
int main(int argc,char * argv[]) {
string N1,N2,w,y;
long long tag,radix;
cin>>N1>>N2>>tag>>radix;
if(tag==1) w=N2,y=N1;
else w=N1,y=N2;
long long ys=conver_radix(radix,y); //已知进制数的十进制
char it = *max_element(w.begin(),w.end());
long long low=(isdigit(it)?it-'0':it-'a'+10)+1; //进制下界:找到最大数字+1, 若最大数字为9,那么最小进制应该为10
long long high=max(low,ys); //进制上界:基准十进制数与下界取较大,INT_MAX不对,第一个测试点错误
long long m = low+((high-low)>>1);
while(low<=high) {// 二分查找
m = low+((high-low)>>1);
// m作为基数,转换数字到十进制,与另外一个数字十进制比较
long long ws = conver_radix(m,w);
if(ws==ys) {
break;
} else if(ws<0||ws>ys) {
high=m-1;
} else {
low=m+1;
}
}
if(low>high)printf("Impossible");
else printf("%d",m);
return 0;
}

PAT Advanced 1010 Radix(25) [⼆分法]的更多相关文章

  1. PAT 甲级 1010 Radix (25)(25 分)进制匹配(听说要用二分,历经坎坷,终于AC)

    1010 Radix (25)(25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 ...

  2. pat 甲级 1010. Radix (25)

    1010. Radix (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a pair of ...

  3. PAT 1010 Radix (25分) radix取值无限制,二分法提高效率

    题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...

  4. 【PAT甲级】1010 Radix (25 分)(二分)

    题意: 输入两个数可能包含小写字母,1或者2,进制大小.第三个数为代表第一个数是第四个数进制的,求第二个数等于第一个数时进制的大小,不可能则输出Impossible,第三个数为2代表第二个数是第四个数 ...

  5. 1010 Radix (25 分),PTA

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536 题意:给定n1.n2两个数,求可以是两 ...

  6. 1010 Radix (25 分)

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  7. 1010 Radix (25分)

    改了一天也没明白,第7个数据是怎么卡的 #include <bits/stdc++.h> using namespace std; const int maxn=1005; typedef ...

  8. PAT甲级1010. Radix

    PAT甲级1010. Radix (25) 题意: 给定一对正整数,例如6和110,这个等式6 = 110可以是真的吗?答案是"是",如果6是十进制数,110是二进制数. 现在对于 ...

  9. PAT甲组 1010 Radix (二分)

    1010 Radix (25分) Given a pair of positive integers, for example, \(6\) and \(110\), can this equatio ...

随机推荐

  1. 一百零七、SAP的OO-ALV之一,新建程序

    一.来带SE38模块,新建一个Z_TIANPAN_20190807_OOALV的本地程序 二.设置一个标题,点击对勾 三.选择保存为本地对象 我们下一篇来写创建屏幕

  2. 创建一个简单的Spring应用

    环境已经安装完成,接下来创建一个简单的Spring应用. 创建Spring应用步骤: 创建一个maven项目 添加spring库依赖 创建Bean类 添加Bean的xml装配文件 创建主类 运行应用程 ...

  3. caffe 官方demo python api

    Jupyter https://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb 涉及: - ...

  4. TX2开发板Ubuntu16.04安装中文输入法

    打开终端输入安装输入法: sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin ...

  5. 19 01 19 视图 HttpReqeust对象 GET属性 POST属性 HttpResponse对象

    ---恢复内容开始--- URLconf 义,指定URL和视图函数的对应关系. 在应用内部创建urls.py文件,指定请求地址与视图的对应关系. url(正则,'视图函数名称') 1)如示例在book ...

  6. LeetCode | No.1 两数之和

    题目描述: Given an array of integers, return indices of the two numbers such that they add up to a speci ...

  7. Python pip换源

    前言 哈喽呀,小伙伴们,晚上好呀,今天要给大家带来点什么呐,我们就来说说python的pip换源吧,这个换源,相对来说,还是比较重要的,能少生好几次气的,哈哈哈 为什么要换源 我们搞python的,肯 ...

  8. Spring学习(三)——@PropertySource,@ImportResource,@Bean注解

    @PropertySource注解是将配置文件中 的值赋值给POJO 项目结构如下 一.创建一个Person.Java文件: import org.springframework.boot.conte ...

  9. 吴裕雄--天生自然 JAVASCRIPT开发学习:switch 语句

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. 洛谷 P1220 关路灯(区间dp,前缀和)

    传送门 解题思路 先明确一下题意,c指的是路灯的编号而不是位置. 然后根据贪心,在从点i去关点j的路灯时,所有经过的路灯都会随手关掉(不耗时间),所以我们可以确定,若i点和j点的路灯已经关闭,那么区间 ...