PAT A1010.Radix 二分法
PAT A1010.Radix
链接: https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536
算法笔记实战指南P167
题意:
给2个数:N和M,给出N的进制,求出M的进制为多少时,才能与N相同,如果不存在这样的进制,给出“Impossible”
N 和 M 都以字符串的形式给出,最多10个digits,从‘0’-‘9’,‘a’-‘z’,代表0-35
注意:
1. 虽然M每位最大是35,但是M的进制可能大于36。
2. M 的进制应该比它的 每一位都大,所以至少是它的所有数位上的最大的数+1,而不是直接以1位L,(这是题目要求)
3. M的进制最大值 = max(M的进制最小值,N的十进制)+1
4. M需要遍历的进制较多,需要二分,将复杂度降到O(log N) ,其中N = M的进制最大值 - M的进制最小值
5. 用上long long , 而且这样也会溢出,因此,转换为十进制后小于N,可能是进制太小,也可能是溢出造成小于0
代码如下:
- #include<iostream>
- #include<stdio.h>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- typedef long long LL;
- char n[],m[];
- int charToInt(char c)
- {
- if(isdigit(c))
- return c-'';
- return c-'a'+;
- }
- // 注意:ans 可能会超过LL的范围,溢出,此时返回值小于0
- LL toDecimal(LL radix, char a[]){
- LL ans = ;
- for(int i = ;a[i];i++){
- ans = ans * radix + charToInt(a[i]);
- }
- return ans;
- }
- // 题目要求了进制必须大于每一位数字,这里查找最小的进制
- int findMinRadix(char a[]){
- int ans = -;
- for(int i = ;a[i];i++){
- ans = max(ans,charToInt(a[i]));
- }
- ans++;
- return ans;
- }
- LL solve(LL l, LL r, LL x){
- LL preJudge = toDecimal(r,m);
- // 注意这里也可以不预先判断,但是如果预先判断了,一定要注意小于x不代表真的小,还可能是溢出
- if(preJudge>&&preJudge<x)
- return -;
- LL mid;
- while(l<=r){
- // 防止 l + r 溢出
- mid = l + (r-l)/;
- LL y = toDecimal(mid, m);
- if(y==x)
- return mid;
- // 注意判断是否溢出,如果溢出,也代表选择的进制太大
- if(y<||y>x)
- r = mid-;
- else
- l = mid+;
- }
- return -;
- }
- int main(){
- int target, radix;
- while(scanf("%s%s%d%d",n,m, &target, &radix)!=EOF){
- char tmp[];
- if(target==){
- strcpy(tmp,n);
- strcpy(n,m);
- strcpy(m,tmp);
- }
- LL x = toDecimal(radix, n);
- LL l = findMinRadix(m);
- LL r = max(l, x)+;
- LL ans = solve(l,r,x);
- if(ans==-)
- printf("Impossible\n");
- else
- printf("%lld\n",ans);
- }
- return ;
- }
PAT A1010.Radix 二分法的更多相关文章
- PAT A1010 Radix (25 分)——进制转换,二分法
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- PAT 1010 Radix 进制转换+二分法
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- PAT甲级——A1010 Radix
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- PAT 1010 Radix (25分) radix取值无限制,二分法提高效率
题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...
- A1010. Radix
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- PAT 1010 Radix (二分)
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- 已经菜到不行了 PAT 1010. Radix (25)
https://www.patest.cn/contests/pat-a-practise/1010 题目大意: 输入四个数字,a,b,c,d. a和b是两个数字,c=1表示是第一个数字,c=2表示是 ...
- A1010 Radix (25 分)
一.技术总结 首先得写一个进制转换函数convert(),函数输入参数是字符串str和需要转化的进制(使用long long数据类型).函数内部知识,使用函数迭代器,即auto it = n.rbeg ...
- PAT 1010 Radix(X)
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = ...
随机推荐
- 基于HALCON的模板匹配方法总结
注:很抱歉,忘记从转载链接了,作者莫怪.... 基于HALCON的模板匹配方法总结 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多 ...
- 13Linux_vsftpd_Samba_NFS实现文件共享_TFTP
vsftpd服务程序: 匿名开放模式 本地用户模式 虚拟用户模式 简单文件传输协议 TFTP:UDP协议,端口69 TFTP服务使用xinetd服务程序来管理. Samba文件共享服务 NFS网络文件 ...
- 5Linux流程控制语句-if、for、while、case语句、计划任务
流程控制语句.计划任务服务程序,今天记录的有点乱,在预习的时候就记了挺多了,书都花了,上几张图. for 循环 →指定一定的范围 while 循环 →指定一定的条件 for循环语句允许脚 ...
- json字符串和json对象之间的转化
一.json字符串转化为json对象 二.json对象转化为json字符串
- SQLServer与MySQL约束/索引命名的一些差异总结
约束是数据库完整性的保证,主要分为:主键/外键/唯一键/默认值/check等类别,约束是一个逻辑概念,表示数据的某些特性(不能为空,唯一,必须满足某些条件等等),索引是一个逻辑与物理概念的结合,逻辑上 ...
- 聊聊JMM
JMM是什么? JMM 全称 Java memory model ,直译过来就是Java内存模型,这里注意了,指到并不是JVM中的内存分布新生代.老年代.永久代这些,当然也不是 程序计数器(PC).j ...
- Sping4之依赖注入
Spring的依赖注入可以是我们不需要去管理bean,网上看到一个回答很精辟: 现在你需要买一把锤子: 1.自己做一把,解释成java就是,调用者创建被调用着,也就是自己去创造一个造锤子的方法,然后自 ...
- java使用selenium版本不兼容解决汇总
selenium之webDriver与浏览器版本问题 http://blog.csdn.net/xqhadoop/article/details/77892796 selenium自动化测试资源整理( ...
- php 安装最新的redis连接扩展
用于与redis连接的Php扩展[RC表示公测,我们用的是不带RC的稳定版本]下载包地址:http://pecl.php.net/package/redis 最新稳定版本:4.3.0 下载包:# wg ...
- 使用PLSQL导出表
前提是登录PLSQL的用户具有导出数据的权限 菜单Tools-->Export Tables