题目分析:

首先这题有很多的坑点,我在写完之后依旧还有第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. idea 模糊搜索 ctrl + f(单词不完整搜索不到的解决办法)

    1,现象描述,笔者在用 idea 的 ctrl + f 搜索文件的内容时,发现了很神奇的问题,就是字符串必须输入完整才能搜索到,输入一半,哪怕是个字母输入了9个也搜不到 2,可以发现,就差一个字母 h ...

  2. Java Web 应用概述

    1.java Web 应用是建立在java语言基础上的企业web应用系统,oracle公司根据行业发展和便于开发制定了一套规范:Java EE规范,截至到当前(2016.3.11)是java EE7规 ...

  3. Kubernetes 使用 Weave Scope 监控集群(十七)

    目录 一.安装 二.使用 Scope 2.1.拓扑结构 2.2.在线操作 2.3.强大的搜索功能 创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所 ...

  4. net core 环境部署的坑

    1.supervisor “no such file” error. 检查指令是否正确,路径.dotnet环境是否正常 2.Couldn‘t find a valid ICU package inst ...

  5. 搜索排序的评价指标NDCG

    refer: https://www.cnblogs.com/by-dream/p/9403984.html Out1 = SELECT QueryId, DocId, Rating, ROW_NUM ...

  6. spark笔记 环境配置

    spark笔记 spark简介 saprk 有六个核心组件: SparkCore.SparkSQL.SparkStreaming.StructedStreaming.MLlib,Graphx Spar ...

  7. 学习数据结构Day1

    数据结构的分类: 线性结构 数组:栈:队列:链表:哈希表:... 树结构 二叉树:二分查找树:AVL;红黑树:Treap:Splay:堆:栈:Trie:线段树:K-D树:并查集:哈夫曼         ...

  8. Nginx+Keepalived实现web服务器高可用

    1.Nginx 业务背景 现公司需求快速搭建web服务器,对外提供给用户web服务. 需求拆分 需要基于http协议的软件,搭建服务实现 介绍 常见用法: 1) web服务器软件 httpd http ...

  9. 深度学习-Wasserstein GAN论文理解笔记

    GAN存在问题 训练困难,G和D多次尝试没有稳定性,Loss无法知道能否优化,生成样本单一,改进方案靠暴力尝试 WGAN GAN的Loss函数选择不合适,使模型容易面临梯度消失,梯度不稳定,优化目标不 ...

  10. nginx静态文件不设置缓存

    找到nginx安装目录下的nginx.conf文件,再nginx里面添加如下的内容 location / { add_header Cache-Control no-cache; add_header ...