题目分析:

首先这题有很多的坑点,我在写完之后依旧还有第10个测试点没有通过,而且代码写的不优美比较冗长勿喷,本篇博客用于记录写这道题的一些注意点

1.关于两个不同进制的数比大小一般采用将两个数都转化为10进制之后比较大小(下面统称已知进制数为N1,未知进制数为N2)

2.虽然两个数都只有10位,且每一位上的数字是从‘0’~‘z’,分别代表0~35,但是这并不意味值这题的进制范围就是2~36,radix完全有可能很大很大到long long,写‘0’~‘z’只是为了让结果计算出来相对小一些,并且迷惑一下

3.由于进制radix有可能很大,故要采用二分查找的方式进行进制的选择判断,否则会超时

4.同时在对每一个二分查询出来的radix进行尝试计算出相应未知进制数N2的10进制表示的过程中有可能溢出long long的范围(会变成负数),需要注意

5.对于已知进制数N1在求出它的10进制表示的时候也有可能溢出long long(这一点比较奇怪,因为如果连已知进制的数N1的10进制表示都是不可记录下来的那如何再去求出N2的10进制二者进行比较呢)

6.对于二分查找N2的进制的时候,N2的下界为N2中数字的最大值+1(例如:10020的最大数字为2,故最低的进制为3进制),而N2的上界则为N1的10进制表示+1(这是一个卡点,这里给出推理的过程)

如果N2的位数超过1位(2位以及以上时),这时候只要1次方位上的数大于等于1,则如果N2的进制为N1的10进制表示+1,则N2永远都大于N1,再大就没有必要了

 #include<iostream>
#include<string>
using namespace std; string n1, n2;
int tag;
long long radix;
int len1, len2;
int a[];
int b[];
long long Min, Max;
int judge; void init_ab(){
len1 = n1.size();
len2 = n2.size();
int cnt = ;
for(int i = len1-; i >= ; i--){
if(n1[i] >= '' && n1[i] <= ''){
a[cnt++] = n1[i] - '';
}else{
a[cnt++] = n1[i] - 'a' + ;
}
}
//因为未知进制数一定存在b中,所以可以顺便求一下未知进制数的进制下界
Min = ;
cnt = ;
for(int i = len2-; i >= ; i--){
if(n2[i] >= '' && n2[i] <= ''){
b[cnt] = n2[i] - '';
if(b[cnt] > Min) Min = b[cnt];
cnt++;
}else{
b[cnt] = n2[i] - 'a' + ;
if(b[cnt] > Min) Min = b[cnt];
cnt++;
}
}
//Min为未知进制数的所有位中最大数+1
Min++;
} void binary_search(){
//首先需要注意的是 Min和Max的大小要保证Min小于等于Max
if(Min > Max){
long long t = Min;
Min = Max;
Max = t;
}
long long left = Min;
long long right = Max;
int flag;
while(left <= right){
long long mid = (left + right) / ;
//计算以mid为进制的未知进制数的10进制表示是否和已知进制的10进制相等
long long ans = ;
long long base;
for(int i = ; i < len2; i++){
if(i == ){
base = ;
ans += base * b[i];
}else{
base *= mid;
if(base < ){
flag = ;
break;
}
ans += base * b[i];
}
//判断溢出或者已经大于已知进制数的10进制表示
if(ans > Max - || ans < ){
flag = ;
break;
}
}
if(ans < Max - ) flag = -;
if(ans == Max - ) flag = ;
if(flag == ){
cout<<mid<<endl;
break;
}else if(flag == -){
left = mid + ;
}else right = mid - ;
}
if(left > right) cout<<"Impossible"<<endl;
} void cal_Max(){
long long base;
//这里设定Max为已知进制数的十进制表示 + 1,且默认不会超过longlong范围,否则题目就太复杂了
Max = ;
for(int i = ; i < len1; i++){
if(i == ){
base = ;
Max += base * a[i];
}else{
base *= radix;
Max += base * a[i];
}
if(Max < ){ //已知进制的数已经溢出 除非n1 n2相等 否则直接impossible?
judge = ;
if(n1 == n2) cout<<radix<<endl;
else cout<<"Impossible"<<endl;
break;
}
}
Max++;
} int main(){
while(cin>>n1>>n2>>tag>>radix){
judge = ;
if(tag == ){ //始终将n1用于存放已知进制的数
string t = n1;
n1 = n2;
n2 = t;
}
//将n1 和 n2两个数的每一位存储到a b数组之中
init_ab();
//求出未知进制数的进制上界
cal_Max();
if(judge == ){
//二分查找在上界和下界之间 计算时可能由于进制太大而溢出需要处理
binary_search();
}
}
return ;
}

PAT甲级1010踩坑记录(二分查找)——10测试点未过待更新的更多相关文章

  1. Unix 网络编程卷一源码编译踩坑记录 ubtutu 19.10

    在阅读unpv1时运行源代码的环境配置,这里简单记录一下 源代码里的README 写得挺详细的,但是在Linux 系统的下还没没办法直接编译通过的, 这里我使用的是ubuntu 19.10(在腾讯云1 ...

  2. PAT甲级1010. Radix

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

  3. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  4. QT踩坑记录1-Q_OBJECT编译问题

    QT踩坑记录1-Q_OBJECT编译问题 QTC++Bugs 错误输出 Q_OBJECT 宏错误的地方会编译出现这样的错误, 无法找到.... 由于自己不想再看到这个错误, 此处 复制自 参考连接1, ...

  5. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  6. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  7. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  8. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  9. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...

随机推荐

  1. VSCode安装MathJax插件

    曾经我一直照网上的教程安装了半天都没有安装好,直到我找到了一个叫"Markdown+Math"的插件,安装好之后就可以用了.

  2. ThinkPHP3开发模式,控制器操作,配置文件,框架语法

    ThinkPHP的开发模式 tp框架有两种使用模式:开发模式(调试模式),一种是生产模式(运行模式) define('APP_DEBUG', true);  //调试模式 define('APP_DE ...

  3. GetComponentsInChildren<Transform>(true)

    GetComponentsInChildren<Transform>(true);//游戏对象下的子物体激活的没激活的都会被拿到,包括游戏对象本身GetComponentsInChildr ...

  4. json对象转js对象

    json数据: { "YD1": 0, "YD2": 0, "YD3": 0, "YD4": 0, "YD5& ...

  5. SQL SERVER 日志写入原理浅析

    昨天看到网上有一个关于SQL SERVER 课件,便随手下载了下来看看主要讲了些什么内容,于是看到了下面两个PPT页面 由于第一张PPT上的内容不太准确(日志文件中没有“日志页”的概念,只有VLF的概 ...

  6. python 之 面向对象(元类、__call__、单例模式)

    7.13 元类 元类:类的类就是元类,我们用class定义的类来产生我们自己的对象的,内置元类type是用来专门产生class定义的类 code=""" global x ...

  7. C 猜猜猜😀文字小游戏

    前言 - 随机性 随机数生成 - https://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90 没啥事情, 写 ...

  8. rancher部署kubernets集群

    docker的安装 先添加docker源 sudo apt update sudo apt install docker.io docker更换国内镜像 1.配置脚本如下: #!/bin/bashca ...

  9. 【实战经验】STM32烧录

    1.编译 2.配置烧录工具 2.配置烧录工具 3.配置烧录工具(一般街上Jlink就能检测到对应的STM32芯片) 5.选择FLASH 4.烧录 5.烧录完成

  10. Jenkins基于https的k8s配置

    一.摘要 jenkins 连接低版本的k8s时,不需要验证.但是新版本的启用了https和角色管理 二.安装kubernetes插件 登录jenkins,点击 Manage Jenkins --> ...