码迷,mamicode.com
首页 > 编程语言 > 详细

算法基础——二分法练习2

时间:2021-06-11 18:11:40      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:each   定义   bsp   blank   进制转化   注意   超过   退出   radix   

二分法练习

一、PAT甲级1010

技术图片

 

 技术图片

 

 题目描述:给出两个不超过10位的“数字”,给出其中一个数的基数(表示这个数是几进制),现在给出的两个数在各自的进制下是相等的,要求找出另一个数在什么进制下与已给出的数相等,如果不存在就返回impossible

输入中:N1,N2表示输入的两个数;radix表示其中一个数的基数,tag1表示radix是N1的基数,tag2同理

 

二、问题分析

  按照题目的描述最高是z表示35,所以这些数最大是36进制,如果对已经给出基数的数分别求各个进制下的表示,这样太复杂,很有可能超时。

  按照二分的思想,可以把这个算法想象成一个猜数字游戏,于是这个算法就变成从数组2~36中找一个数作为符合要求的基数,可以用二分查找法,为了方便计算就把两个数都转成10进制进行比较。

 

三、算法描述

  分析:首先要分析二分查找的过程,不妨假设一下,已知十进制数120,现在找78对应的基数,使得78=120(78这个数是我用120在16进制转化而来,所以要求的目标结果就是16);那么先取(2+36)/2=19作为基数,计算8*19^0+7*19^1=133;因为133比120大,而且预期结果是16,所以可以断定19取大了,那么就向下压缩,这样就可以得到核心算法了

  核心算法:定义三个变量l,r,mid分别作为下界,上界,结果。int l=2,r=36,mid; 

      循环条件为l<r while(l<r)

        每次循环计算mid=(r+l)/2;

        以mid为基数计算对应10进制数,如果结果比N1(假设给出的tag=1)的十进制形式大,就取r=mid-1;小就取l=mid+1,等就退出循环取mid为基数

        如果循环结束时l=r就输出impossiblle

  优化:这里因为n2这个数是给出的,只要找出n2中每位数字里的最大值,这个最大值可以作为下界,而不需要以2为下界

  下面定义数据结构;首先需要一个数据结构来对应a-z的值,可以使用一个结构体,手动打表,但是C++中数组下标可以使用字母(https://blog.csdn.net/alovelypeach/article/details/114271843)所以直接用字母当下标就行

 

四、代码

  技术图片技术图片

 

 技术图片技术图片

 

 

 注意,该代码无法在PAT运行,可以在devc++中运行,应该是编译器的问题,这里的代码只是一种思路,可以有多种不同的代码样式,但核心思想就是上述提出的

 

算法基础——二分法练习2

标签:each   定义   bsp   blank   进制转化   注意   超过   退出   radix   

原文地址:https://www.cnblogs.com/zyq79434/p/14872787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!