PAT甲级1010 Radix :[C++题解]进制位、秦九韶算法、二分(PAT通过率最低的一道题0.11)
文章目录
- 题目分析
- 题目链接
题目分析
分析:
本题思路分两步。
第一步:先把给出数值和进制的数,暂定为N1,转换成10进制,即为target。
第二步: 判断一下N2在多少进制下是等于target的。
然后看一下数据范围。
给的进制数最大是36进制,数最多是10位,因此N1最大可能是3610<1×101636^{10}< 1 \times 10^{16}3610<1×1016 会爆int,用long long (范围9×10189 \times 10^{18}9×1018)来存。
第二个数N2的进制数最大是多少呢? 当N2的位数很少的时候,它的进制数会很大,最大跟N1十进制下的最大值差不多,比如(10)radix=1×radix=radix,转化为十进制等于radix,而这个radix需要等于N1的十进制数。(10)_{radix}= 1\times radix =radix,转化为十进制等于radix,而这个radix 需要等于N1的十进制数。(10)radix=1×radix=radix,转化为十进制等于radix,而这个radix需要等于N1的十进制数。N1的量级在10^16次方上,所以待求的进制也需要用long long 来存,否则会爆int。
所以,这里不要误以为让求的进制也在36之内,这是错误的!!! 待求进制数非常大,会爆int。
经过上面的分析,我们已经知道待求进制数 在1~targettargettarget之间,枚举的区间比较大。
假设 k进制下4位数为:(abcd)k(abcd)_k(abcd)k,它表示的十进制是s=a×k3+b×k2+c×k+ds=a \times k^3 + b \times k^2 +c \times k + ds=a×k3+b×k2+c×k+d
当进制k变大的时候,这个数对应的十进制数是在变大的。 这是单调的!!! 所以我们会想到 用二分法来加速枚举进制。
每次二分查找进制区间[1,target][1 , target][1,target]的一个中点mid ,判断 mid进制下得到的十进制数 和 target的关系,如果小,则 在mid的右侧区间在二分查找;如果大了,则在mid的左侧区间继续查找进制。
这里的左边界是1不严谨,实际上进制数最小值应该是 N2中出现的数字的最大值+1. 比如N2 = 123 那么这个数的进制最小也是 3+1 =4进制。
所以,我们可以二分查找第一个大于等于target这个数的进制mid。如果这个数等于target说明有解,否则说明无解。
ac代码
#include<bits/stdc++.h>
using namespace std;typedef long long LL;//0到z的字符表示:映射成 int型的 0 到35 整型数
int get(char c){if(c <= '9') return c-'0';return c-'a'+10; // a~z 映射到10~35
}// r进制转化为 十进制
LL calc(string a , LL r){LL res = 0;for(auto c: a){//如果计算出来的结果很大,大于long long 说明肯定无解,因为进制数不超过1e16//此时仅需要返回1个大的数即可if((double)res *r + get(c) > 1e16) return 1e18;res = res * r + get(c); //秦九韶算法 求十进制数}return res;
}int main(){string n1,n2; //两个数cin>>n1>>n2;int tag ,radix; //进制cin>>tag >> radix;//目的是让n1已知,n2待求。if(tag==2) swap (n1 ,n2); LL target = calc(n1, radix); // 计算十进制下是多少//二分查找一个合适的进制LL l =1, r = target+1; //进制的最大值是target+1.//求进制的最小值for(auto c: n2) l =max(l , (LL)get(c)+1); while(l<r){LL mid = l +r >> 1;if(calc(n2,mid)>=target) r=mid;else l = mid +1;}//while退出的时候l ==r//大于等于target的第一个数 if(calc(n2, r)!=target){cout<<"Impossible";}else cout<<r<<endl;}
补充:
秦九韶算法 用来快速求其他进制转换为十进制的值是多少。
// r进制转化为 十进制
//a中存的是r进制数数值, r表示进制
LL calc(string a , LL r){LL res = 0;for(auto c: a){res = res * r + get(c); //秦九韶算法 求十进制数}return res;
}
上面用到的get函数是用来将字符转变成数字,比如a变成10
//0到z的字符表示:映射成 int型的 0 到35 整型数
int get(char c){if(c <= '9') return c-'0';return c-'a'+10; // a~z 映射到10~35
}
来源:维基百科
比如m进制数abcd转换成十进制数是多少?
r=0;
r= r*m +a;
r= r*m+b;
r=r*m+c;
r=r*m+d;
可以用循环来写
十进制转化为其他进制:带余除法。
题目链接
PAT甲级1010 Radix
PAT甲级1010 Radix :[C++题解]进制位、秦九韶算法、二分(PAT通过率最低的一道题0.11)相关推荐
- 【PAT甲级】字符串处理及进制转换专题
目录 字符串处理 PAT甲级 1001 A+B Format (20 分) PAT甲级1005 Spell It Right (20 分) PAT甲级1035 Password (20 分) PAT甲 ...
- pat 甲级 1010. Radix (25)
1010. Radix (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a pair of ...
- PAT甲级1019 General Palindromic Number:[C++题解]进制位、回文数、vector来做
文章目录 题目分析 题目链接 题目分析 ac代码 #include<bits/stdc++.h> using namespace std;//判回文数 bool check(vector& ...
- PAT甲级1027 Colors in Mars :[C++题解]进制位
文章目录 题目分析 题目链接 题目分析 就是十进制数转化成13进制,然后数字转化成字符. get函数用来将数字转化成字符. 如果 一位数 就是return x +'0'如果 大于9 就是 return ...
- PAT甲级1015 Reversible Primes :[C++题解]进制位、秦九韶算法、判质数
文章目录 题目分析 题目链接 题目分析 十进制转化为d进制如何做? while(n){n% d; //取d进制数下的最低位n/=d; } 比如 十进制下的n=13 ,进制d =2.经过 反复的n%d ...
- PAT甲级1100 Mars Numbers:[C++题解]进制位、使用stringstream类读入
文章目录 题目分析 题目分析 分析: 使用char型二维数组 names[][5] 存储这些 火星文. ac代码 #include<iostream> #include<sstrea ...
- 算法笔记:时间复杂度、空间复杂度 进制转化 秦九韶算法
一.何为算法. 算法是解决问题的方法与步骤,一般通过考虑算法的时间复杂度和空间复杂度来判断一个算法的优秀度. eg:常见的时间复杂度:O(1) <O(logn)< O(n) <O( ...
- PAT甲级1010 (进制和二分法)
题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...
- 洛谷 P1013 进制位
P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...
最新文章
- 在全面部署 IPV6 前,你需要了解都在这儿
- java中使用okhttpsoap,Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- 建立项目接口文档_分享:一步一个脚印,vue入门之使用mockjs搭建vue项目测试服务器...
- 数据库系统实训——实验七——触发器
- 常见错误:未能加载文件或程序集
- C# pictureBox桌面大小自适应 大小自适应 窗体居中
- 医脉神剑之超声成像基础原理(转)
- 混淆矩阵 matlab代码示例
- 网络篇 OSPF的DR与BDR的选举-48
- 【转载】外设使用Tips之MPC574xP系列汽车级MCU的SWT看门狗定时器配置与使用
- oracle收集统计信息和直方图,oracle统计信息和直方图
- Hdu 2389 Rain on your Parade
- python 召回率_使用sklearn获取精确性和召回率
- java没有编译器吗_java有编译器吗
- blender 插件使用笔记
- 新人贴:MATLAB 错误使用 surf (line 74) X、Y、Z 和 C 不能是复数。
- 记录一次Ubuntu18.04安装教程和解决安装NVIDIA显卡驱动出现黑屏问题
- 等了7年!微信电脑版终于有这个重磅功能了
- 优优加速cdn带宽_cdn加速原理是什么,正常1m宽带服务器能提升多少速度-问答-阿里云开发者社区-阿里云...
- 免费WiFi上网来袭
热门文章
- linux 系统优化初始化配置
- 软件测试之Selenium IDE
- Insufficient free space for journal files
- 医疗在线服务InQuicker,融资0元年盈利400万美元!拒绝风投与炒作
- java resume过时方法_学点开发|关于Java多线程用法解析
- 测量分类准确率的过程算坍缩吗?
- 【PC工具】200324更新百度网盘下载工具——最新百度网盘下载工具使用方法及注意事项...
- 【SNN脉冲神经网络】SNN脉冲神经网络的工作原理演示MATLAB仿真带GUI界面
- 1.为什么要学习MATLAB
- 利用 T-sql 的从句 for xml path('') 实现多行合并到一行, 并带有分隔符