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

代码如下:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6.  
  7. typedef long long LL;
  8.  
  9. char n[],m[];
  10.  
  11. int charToInt(char c)
  12. {
  13. if(isdigit(c))
  14. return c-'';
  15. return c-'a'+;
  16. }
  17.  
  18. // 注意:ans 可能会超过LL的范围,溢出,此时返回值小于0
  19. LL toDecimal(LL radix, char a[]){
  20. LL ans = ;
  21. for(int i = ;a[i];i++){
  22. ans = ans * radix + charToInt(a[i]);
  23. }
  24. return ans;
  25. }
  26.  
  27. // 题目要求了进制必须大于每一位数字,这里查找最小的进制
  28. int findMinRadix(char a[]){
  29. int ans = -;
  30. for(int i = ;a[i];i++){
  31. ans = max(ans,charToInt(a[i]));
  32. }
  33. ans++;
  34. return ans;
  35. }
  36.  
  37. LL solve(LL l, LL r, LL x){
  38. LL preJudge = toDecimal(r,m);
  39. // 注意这里也可以不预先判断,但是如果预先判断了,一定要注意小于x不代表真的小,还可能是溢出
  40. if(preJudge>&&preJudge<x)
  41. return -;
  42. LL mid;
  43. while(l<=r){
  44. // 防止 l + r 溢出
  45. mid = l + (r-l)/;
  46. LL y = toDecimal(mid, m);
  47. if(y==x)
  48. return mid;
  49. // 注意判断是否溢出,如果溢出,也代表选择的进制太大
  50. if(y<||y>x)
  51. r = mid-;
  52. else
  53. l = mid+;
  54. }
  55. return -;
  56. }
  57.  
  58. int main(){
  59. int target, radix;
  60. while(scanf("%s%s%d%d",n,m, &target, &radix)!=EOF){
  61. char tmp[];
  62. if(target==){
  63. strcpy(tmp,n);
  64. strcpy(n,m);
  65. strcpy(m,tmp);
  66. }
  67. LL x = toDecimal(radix, n);
  68. LL l = findMinRadix(m);
  69. LL r = max(l, x)+;
  70. LL ans = solve(l,r,x);
  71. if(ans==-)
  72. printf("Impossible\n");
  73. else
  74. printf("%lld\n",ans);
  75. }
  76. return ;
  77. }

PAT A1010.Radix 二分法的更多相关文章

  1. PAT A1010 Radix (25 分)——进制转换,二分法

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  2. PAT 1010 Radix 进制转换+二分法

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  3. PAT甲级——A1010 Radix

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  4. PAT 1010 Radix (25分) radix取值无限制,二分法提高效率

    题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...

  5. A1010. Radix

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  6. PAT 1010 Radix (二分)

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  7. 已经菜到不行了 PAT 1010. Radix (25)

    https://www.patest.cn/contests/pat-a-practise/1010 题目大意: 输入四个数字,a,b,c,d. a和b是两个数字,c=1表示是第一个数字,c=2表示是 ...

  8. A1010 Radix (25 分)

    一.技术总结 首先得写一个进制转换函数convert(),函数输入参数是字符串str和需要转化的进制(使用long long数据类型).函数内部知识,使用函数迭代器,即auto it = n.rbeg ...

  9. PAT 1010 Radix(X)

    1010 Radix (25 分)   Given a pair of positive integers, for example, 6 and 110, can this equation 6 = ...

随机推荐

  1. 基于HALCON的模板匹配方法总结

    注:很抱歉,忘记从转载链接了,作者莫怪.... 基于HALCON的模板匹配方法总结 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多 ...

  2. 13Linux_vsftpd_Samba_NFS实现文件共享_TFTP

    vsftpd服务程序: 匿名开放模式 本地用户模式 虚拟用户模式 简单文件传输协议 TFTP:UDP协议,端口69 TFTP服务使用xinetd服务程序来管理. Samba文件共享服务 NFS网络文件 ...

  3. 5Linux流程控制语句-if、for、while、case语句、计划任务

    流程控制语句.计划任务服务程序,今天记录的有点乱,在预习的时候就记了挺多了,书都花了,上几张图. for 循环      →指定一定的范围 while 循环 →指定一定的条件   for循环语句允许脚 ...

  4. json字符串和json对象之间的转化

    一.json字符串转化为json对象 二.json对象转化为json字符串

  5. SQLServer与MySQL约束/索引命名的一些差异总结

    约束是数据库完整性的保证,主要分为:主键/外键/唯一键/默认值/check等类别,约束是一个逻辑概念,表示数据的某些特性(不能为空,唯一,必须满足某些条件等等),索引是一个逻辑与物理概念的结合,逻辑上 ...

  6. 聊聊JMM

    JMM是什么? JMM 全称 Java memory model ,直译过来就是Java内存模型,这里注意了,指到并不是JVM中的内存分布新生代.老年代.永久代这些,当然也不是 程序计数器(PC).j ...

  7. Sping4之依赖注入

    Spring的依赖注入可以是我们不需要去管理bean,网上看到一个回答很精辟: 现在你需要买一把锤子: 1.自己做一把,解释成java就是,调用者创建被调用着,也就是自己去创造一个造锤子的方法,然后自 ...

  8. java使用selenium版本不兼容解决汇总

    selenium之webDriver与浏览器版本问题 http://blog.csdn.net/xqhadoop/article/details/77892796 selenium自动化测试资源整理( ...

  9. php 安装最新的redis连接扩展

    用于与redis连接的Php扩展[RC表示公测,我们用的是不带RC的稳定版本]下载包地址:http://pecl.php.net/package/redis 最新稳定版本:4.3.0 下载包:# wg ...

  10. 使用PLSQL导出表

    前提是登录PLSQL的用户具有导出数据的权限 菜单Tools-->Export Tables