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 ...
随机推荐
- python 根据生日计算年龄 sqlalchemy根据身份证号计算生日 性别
import datetime '): birth_d = datetime.datetime.strptime(birth_s, "%Y%m%d") today_d = date ...
- java.lang.ClassNotFoundException: org.apache.http.impl.client.HttpClientBuilder
添加依赖即可:compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.6' ,注意是apache的包
- 【论文阅读】PBA-Population Based Augmentation:Efficient Learning of Augmentation Policy Schedules
参考 1. PBA_paper; 2. github; 3. Berkeley_blog; 4. pabbeel_berkeley_EECS_homepage; 完
- 使用命令行操作vmware esxi -- powershell
之前提到过用linux命令行的方法操作vmware,这节我们来使用powershell的方式来操作.在操作之前需要下载安装一款命令行工具PowerCLI,本节只列出一些常用命令. 个人认为powerc ...
- activiti学习1:开发环境的搭建
activiti学习1:开发环境的搭建 本文中使用maven+eclipse搭建activiti-5.14的开发环境 一.创建maven工程 创建一个普通的java工程,pom文件的内容如下 < ...
- 电视CI卡详解
CAM卡中文名视密卡,它是一种数字视频条件接收模块,是一个连接电视机与外部信号源的设备.它可以将压缩的数字信号转成电视内容,并在电视机上显示出来.CAM卡(亦称大卡)和智能卡(亦称小卡)配合使用,插入 ...
- 新唐NDA102EC1中更改UUART1作为调试串口打印输出调试信息
新唐NDA102EC1中更改UUART1作为调试串口打印输出调试信息 参考网上STM32修改fputc(int ch, FILE *f),把串口打印函数printf()重定向到UUART1模块的端口输 ...
- SpringBoot整合websocket
1.新增pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- setPos 详解
etWindowPos 详解 函数名: SetWindowPos 头文件: winuser.h 函数原型: BOOL SetWindowPos ( HWND hWnd, //窗口句柄 HWND h ...
- Taylor()函数总结
Taylor()函数总结 Taylor展开式公式的具体形式见百度百科:https://baike.baidu.com/item/%E6%B3%B0%E5%8B%92%E5%85%AC%E5%BC%8F ...