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 ...
随机推荐
- LeetCode_482. License Key Formatting
482. License Key Formatting Easy You are given a license key represented as a string S which consist ...
- 多用户远程连接设置(WindowsServer2008/Win7)
一.Windows server2008 1.点击计算机--->右键属性打开系统对话框.进行如图设置. 2.在开始菜单--->运行中输入gpedit.msc打开本地组策略编辑器对话框. 3 ...
- 怎么去掉织梦(dedecms)网站首页默认携带的index.html尾巴
如果你的网站带小尾巴,比如这样的 那你就要注意了,因为这会导致搜索引擎会认为和不带尾巴的页面是两个页面,都会参与排名,会分散首页的权重. 那我们怎么去除呢? 方法1: 1)在空间面板里面找到默认首页设 ...
- SPI ServiceLoader源码分析
public class ddd { public static void main(String[] args) { ServiceLoader1<Hello> sl = Service ...
- javascript异步上传压缩图片并立即显示图片
javascript异步上传压缩图片并立即显示图片<pre><!doctype html><html><head><meta charset=&q ...
- Hive drop table,create table没有反应处理方法
Hive drop table时没有反应,于是强制中断. 解决之法,对其进行补充. mysql> show variables like 'char%';第一步:进入mysql,输入:show ...
- Linux基础(09)aio高级编程
1.出于安全性 Linux有一个机制 应用层和内核层是无法互相直接读取内存的, 他们要互相读取数据是有一个拷贝过程的, 如: 应用层要读取内核层的数据就调用read(), 内核就会先把数据copy到一 ...
- PHP 使用 pdo 操作oracle数据库 报错
## SELECT UNID,NAME,NAME_XML WHERE UNID>=10 AND UNID<=15 ## 在10到15这5条数据中不为空数据php: symbol looku ...
- 或与异或 [背包DP]
也许更好的阅读体验 \(\mathcal{Description}\) 给定\(n\)和长度为\(n\)的数组\(a\) 问从\(a\)中选取任意个数使得其 异或起来的值 等于 或起来的值 的方案数 ...
- 关于使用KubeSphere中的docker配置Harbor仓库http访问docker login登陆报错的解决办法
# 先进入harbor目录中,停止harbor docker-compose stop # 然后修改docker相关文件 # 第一种方式:修改/etc/docker/daemon.json { &qu ...