PAT甲级1010踩坑记录(二分查找)——10测试点未过待更新
题目分析:
首先这题有很多的坑点,我在写完之后依旧还有第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测试点未过待更新的更多相关文章
- Unix 网络编程卷一源码编译踩坑记录 ubtutu 19.10
在阅读unpv1时运行源代码的环境配置,这里简单记录一下 源代码里的README 写得挺详细的,但是在Linux 系统的下还没没办法直接编译通过的, 这里我使用的是ubuntu 19.10(在腾讯云1 ...
- PAT甲级1010. Radix
PAT甲级1010. Radix (25) 题意: 给定一对正整数,例如6和110,这个等式6 = 110可以是真的吗?答案是"是",如果6是十进制数,110是二进制数. 现在对于 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- QT踩坑记录1-Q_OBJECT编译问题
QT踩坑记录1-Q_OBJECT编译问题 QTC++Bugs 错误输出 Q_OBJECT 宏错误的地方会编译出现这样的错误, 无法找到.... 由于自己不想再看到这个错误, 此处 复制自 参考连接1, ...
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- google nmt 实验踩坑记录
最近因为要做一个title压缩的任务,所以调研了一些text summary的方法. text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...
随机推荐
- SonarQube - 常用配置与操作
1 - SonarQube服务器中的数据库配置 2019年4月10号,SonarQube发文称在7.9之后,所有的SonarQube的版本(CE.DE.EE和DCE)中将停止对MySQL的支持. 建议 ...
- solr添加中文IK分词器,以及配置自定义词库
Solr是一个基于Lucene的Java搜索引擎服务器.Solr 提供了层面搜索.命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式).它易于安装和配置,而且附带了一个基于H ...
- SpringBoot系列教程web篇之过滤器Filter使用指南
web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多.基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用) ...
- CentOS 7 编译安装clang+llvm
天在CentOS上将最新版本的LLVM套件(LLVM,Clang和Libc++)编译安装好了,中间遇到了不少问题.虽然已经有很多博客介绍如何编译安装LLVM了,但是根据我自己亲身体验的情况来看,还是有 ...
- C#多线程那点事——信号量(Semaphore)
信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量. 那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程 ...
- 将笔记本无线网卡链接wifi通过有线网卡共享给路由器
1.背景 背景这个就说来长了,在公司宿舍住着,只给了一个账号,每次登录网页都特别麻烦(需要账号认证那种).然后每个账号只支持一个设备在线,这就很尴尬了,那我笔记本.手机.Ipad怎么办? 当然,这时候 ...
- VMnet1、VMnet8到底是什么?
当我们安装VMware Workstation后,在宿主机(物理电脑)上会多出两个网卡,VMNet1.VMNet8,在虚拟机设置里会多出一个配置 VMNet0. vmnet1和vmnet8是两个虚拟网 ...
- netty例子-客户端每隔5秒发送查询时间的请求,服务器端响应请求
netty是jboss公司开发的,基于异步的.事件驱动的网络应用程序框架,快速开发高性能.高可靠性的服务器和客户端程序 public class TimeServer { ; public void ...
- Python代码约定
建议遵守以下约定: 使用 4 个空格来缩进 永远不要混用空格和制表符 在函数之间空一行 在类之间空两行 字典,列表,元组以及参数列表中,在 , 后添加一个空格.对于字典,: 后面也添加一个空格 在赋值 ...
- CORS解决跨域问题(403问题)
1.什么是跨域问题? 跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是用当前页同域名同端口的路径,这能有效的阻止跨站攻击. 2.跨域问题出现的条件: 1.跨域问题是a ...