高考专题复习专题九 其他常用算法信息技术.docx
- 文档编号:4011734
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:23
- 大小:168.85KB
高考专题复习专题九 其他常用算法信息技术.docx
《高考专题复习专题九 其他常用算法信息技术.docx》由会员分享,可在线阅读,更多相关《高考专题复习专题九 其他常用算法信息技术.docx(23页珍藏版)》请在冰豆网上搜索。
高考专题复习专题九其他常用算法信息技术
专题九 其他常用算法
1.(2019·4月浙江省选考)小明基于冒泡排序思想设计了一个改进的排序算法。
该算法先用冒泡法将数组a中奇数位置的元素、偶数位置的元素分别进行排序,然后再进行后续处理。
算法的VB程序段如下,但加框处代码有错,请改正。
′待排序数据存储在数组a中(a
(1)~a(n)),要求升序排列
Fori=1To(n-1)\2
Forj=1Ton-i*2
If
Then′
(1)
t=a(j):
a(j)=a(j+2):
a(j+2)=t
EndIf
Nextj
Nexti
Fori=1Ton\2
j=2*i-1
Ifa(j)>a(j+1)Thent=a(j):
a(j)=a(j+1):
a(j+1)=t
Nexti
Fori=
Step2′
(2)
t=a(i):
j=i-1
DoWhilet a(j+1)=a(j): j=j-1 Loop a(j+1)=t Nexti 解析 插入排序也是经常要考到的问题。 先是分别对奇数位和偶数位进行排序,排序后再使偶数位大于前面的元素,最后进行插入排序,只需要对奇数位进行插入排序即可。 仅奇数位插入排序,i从1时会导致出现a(0)下标越界,所以i从3开始,即第二空答案为3Ton。 答案 (1)a(j)>a(j+2) (2)3Ton 2.(2018·11月浙江选考)某种数据加密方法描述如下(加密前后的数值都是0~255的整数): •以m个数据为一段,将n个待加密数据依次分割成若干个数据段。 剩余数据(个数小于m)为一个独立数据段。 •数据段加密规则: 数据个数等于m的数据段,先进行值变换,再进行位置变换,得到加密数据段。 数据个数小于m的数据段,只进行值变换,直接得到加密数据段。 •依次合并加密数据段,即为最后的加密数据。 值变换: 用值变换密钥数组x(元素个数为m,值为0~255的整数),将待加密数据段中的数据进行值变换,方法如下: 值变换后第i个元素=(待加密数据段第i个元素+x(i))Mod256,其中i=1,2,…,m 位置变换: 用位置变换密钥数组y(元素个数为m,值为1~m的不重复整数),将上述值变换后的m个元素进行段内位置变换,方法如下: 加密后数据段第y(i)个元素=值变换后第i个元素,其中i=1,2,…,m 例如,n=5,m=3的数据加密过程如下: (1)已知m=3,数组x与数组y中的数据如下表所示。 则待加密数据段“155,1,250”加密后的数据段为________(填数据,用逗号分隔)。 x (1) x (2) x(3) 10 20 30 y (1) y (2) y(3) 3 1 2 (2)小张根据上述加密算法,设计了一个对应的解密程序,其VB代码如下,请在划线处填入合适的代码(解密与加密使用相同的密钥数据)。 PrivateSubCommand1_Click() Constn=100 Constm=6 DimiAsInteger,jAsInteger Dima(1Ton)AsInteger,b(1Ton)AsInteger Dimx(1Tom)AsInteger,y(1Tom)AsInteger ′读取值变换与位置变换的密钥数据,分别保存在数组x与y中,代码略。 ′读取待解密数据,保存在数组a中,代码略。 ′下面进行位置变换: 位置变换后数据保存到数组b中 Fori=1To____①____ Forj=1Tom ____②____ Nextj Nexti Fori=(n\m)*m+1Ton b(i)=a(i) Nexti ′下面进行值变换: 值变换后数据仍保存到数组b中 j=1 Fori=1Ton b(i)=____③____ j=j+1 Ifj>mThenj=1 Nexti ′输出解密后数据,代码略。 EndSub 解析 数据构成环是本题考核的其中一个问题。 155,1,250值变换后变成165,21,24,位置变换后变成21,24,165。 加密时,先进行值变换,再进行位置变换,解密时应先位置变换,再进行值变换。 进行位置变换时,变量i表示共有多少整数段,也可以理解为多少行,易知完整的m个数据段的个数为nm个.变量j表示每段中每列的位置。 当i=1时,完成第1段数据变换,即b(j)=a(y(j)),当i=2时,完成第2段数据变换,即b(m+j)=a(m+y(j)),当i=3时,完成第3段数据变换,即b(m*2+j)=a(m*2+y(j)),当i=4时,完成第4段数据变换,即b(m*3+j)=a(m*3+y(j))……归纳得出第i段数据变换为b((i-1)*m+j)=a((i-1)*m+y(j))。 在进行值变换时,加密时值的变换方式为b(i)=(b(i)+x(j))Mod256。 推导出解密时b(i)=b(i)-x(j),其中b(i)>=x(j)或b(i)=b(i)-x(j)+256,其中b(i) b(i)=(b(i)-x(j)+256)Mod256。 答案 (1)21,24,165 (2)①nm 或Int(n/m) ②b((i-1)*m+j)=a((i-1)*m+y(j)) ③(b(i)+256-x(j))Mod256 或(b(i)+256-x((i-1)Modm+1))Mod256 1.插入排序也是一种排序的方法,在各地的模拟卷是经常出现。 其算法的原理可以理解为在整理一幅扑克牌的过程,当摸到两张及以上牌,将牌放在合适位置,实现整幅牌从小到大排列。 2.数据构成环在数据加密、钟表等问题中经常出现。 关键是构成环的原理。 考点1 插入排序 一、排序思想 在将第i个数key插入到数据区间[1,i-1]或[i+1,n]范围内,使得数据区间[1,i]或[i,n]有序。 重复执行n-1遍,使得全部数据有序。 该算法包括两个步骤,一是查找key位置,二是把key放在该位置上。 查找key位置的方法是: 把a(i)赋值给key,如果从前往后有序,变量j从i-1位置开始,向前查找,a(j)与key比较,直到找到位置或找到最前面(j=1)。 如果从后往前有序,变量j从i+1位置开始,向后查找,a(j)与key比较,直到找到位置或找到最后面(j=n)。 二、算法实现 1.理解变量i、j和key的含义 变量i每次要插入数的位置,key表示第i个数的值。 j表示查找和比较位置位置。 2.从前往后有序,进行升序排列 从第2个数(i的初值为2)开始,插入到前面有序的数列中。 某数列已经插入3个数,数列为49,60,71,61,54,3,66,以i=4为例说明插入排序的过程。 查找位置j: 区间为[1,3],从第3个数开始向前查找。 比较对象: 先把当前a(i)的值存在变量key中,再用key分别与前面的数a(j)进行比较。 找到位置的条件: 比前面的数大,即key≥a(j)。 当key≥a(j)时,key应所处的位置是j+1。 如果没有找到位置,条件是key<a(j),把该数向后移动,即把a(j)赋值给a(j+1),a(j)=a(j+1)。 三、实现的核心代码 四、也可以从后往前进行插入排序 变量i的初值是n-1,一直插入排序,使得第1个数在序。 【例1】小明对两个班级的90名同学进行编号,随机产生不同号码,对于其中相同的号码,只保留一个,在号码产生过程中,号码始终是从小号到大号排列,直到找到10个同学号码为止。 1)用b数组表示该号码是否产生,b(x)若为0,表示x未产生; 2)先产生第1个号码,从第2个开始,产生数x,先判断b(x)的值,如果为0,再去插入到合适位置; 3)如果x比前面第一个数大,则直接放入a(i)数组元素中,否则利用对分查找法找到相应位置; 4)从该数x应该存放的位置开始的数据向后移动,并把该数x存放起来。 单击“产生”按钮Command1,在列表框List1中输出每次产生的号码。 请在划线处填入合适的代码。 Dima(10)AsInteger,b(100)AsInteger PrivateSubCommand1_Click() Dimi AsInteger,xAsInteger,sAsString a (1)=Int(Rnd()*90+1): b(a (1))=1 ①____ DoWhilei<=10 x=Int(Rnd()*90+1) Ifb(x)=0Then If____②____Then a(i)=x Else wz=seach(i,x) Fork=i-1TowzStep-1 a(k+1)=a(k) Nextk ____③____ EndIf b(x)=1: s=“产生前”+Str(i)+“个号码是: ” Forj=1Toi s=s+Str(a(j)) Nextj List1.AddItems i=i+1 EndIf Loop EndSub Functionseach(pAsInteger,xAsInteger)AsInteger DimmAsInteger,jAsInteger m=Int(p/2) If______④____Then j=m+1 DoWhilea(j) j=j+1 Loop Else Ifm=1Thenj=1Elsej=m-1 DoWhilea(j)>xAndj>=1 j=j-1 Loop j=j+1 EndIf seach=j EndFunction 解析 变量i表示插入的位置,往往从第2个位置开始。 B数组是一个标志,若其值为0,表示该下标的数没有出现过。 若他比前一个数大,直接放入第i个位置,否则进行查找,并放入合适位置。 答案 ①i=2 ②x>a(i-1) ③a(k+1)=x ④a(m) 【变式训练1】在编号为1-100的观众中随机产生10位不同的幸运观众,并将幸运观众的编号升序排列。 请在划线处填入合适的代码。 n=10: a (1)=Int(Rnd*100+1) i=2 DoWhilei<=n t=Int(Rnd*100+1) Forj=1Toi-1 Ifa(j)=tThenExitFor Nextj If____①____Then Forj=i-1To1Step-1 Ifa(j)>tThena(j+1)=a(j)ElseExitFor Nextj ____②____ i=i+1 EndIf Loop 解析 要求产生10位不同的幸运观众,在已经产生的号码中先进行查找,如果没有重复,会找到i的位置。 在利用插入排序的思想,把新产生的数放入合适的位置。 答案 ①i=j ②a(j+1)=t 考点2 约瑟夫环问题 约瑟夫环是一个数学的应用问题: 已知n个人(以编号1,2,3……n分别表示)围坐在一张圆桌周围。 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 在生活中会碰到类似很多问题,如钟表走向、值日的轮值等。 一、以24小时制式计算(0点-23点),完成如下表格 t的初值 经历时长(n) 结果时间 统一 表达式 t=3时 13小时后 16时 (t+n)Mod24 23小时后 2时 t=15时 -3小时后 12时 (t+n+24) Mod24 -18小时后 21时 二、将字母表的字母A替换为E,B替换为F,C替换为G,…,W替换为A,X替换为B,… 对于环的操作一般用Mod运算符进行计算,某个数Modn的范围是[0,n-1],其他下标必须从0开始编号。 若要实现从1开始编号,需把编号减去1,进行运算后,再加上1。 对于任意字母表中第t个位置的字母加密后的表达式为(t-1+4)Mod26+1。 如字母w在字母表中处于第23,代入以上公式,加密后为第1个位置。 字符ch转换的表达式是Chr((Asc(ch)-1+4)Mod26+1)。 也可以用以下自定义函数来实现大写字母x向后移动y个位置的功能 FunctionRun(xAsString,yAsInteger)AsString DimansAsInteger ans=Asc(x)-65 ans=(ans+y)Mod26 Run=Chr(ans+65) EndFunction 同理,例如对于一个m行乘以n列的矩阵,第i个位置元素所处的列数为(i-1)Modn+1。 所处行为(i-1)\n+1。 【例2】字符环上的最长公共字符串。 将字符串首尾相接后可以得到一个环,如图1和图2分别是由字符串“ABCUVKLM”和“MADJKLUVKL”首尾相接后得到的环。 在图1和图2所示的两个环中,最长的公共字符串为“UVKLMA”(图中带背景圆圈表示)。 编写VB程序,实现如下功能: 在文本框Text1和Text2中分别输入一个字符串(仅由大写字母构成,每个字符串长度不超过100),单击命令按钮Command1后,在标签Label3中输出两个字符串构成的环的最长公共字符串长度(字符串在环中必须连续)。 程序运行效果如图所示。 实现上述功能的VB程序如下,请回答下列问题: (1)根据题意描述,字符串“BCEFGK”和“GKBLMCKEF”的最长公共字符串长度为________。 (2)请在划线处填入合适的代码。 Functiongetmin(aAsInteger,bAsInteger)′获取两个整数的较小者 Ifa EndFunction PrivateSubCommand1_Click() Dims1AsString,s2AsString,iAsInteger,jAsInteger,xAsInteger,yAsInteger DimcntAsInteger,ansAsInteger,len1AsInteger,len2AsInteger s1=Text1.Text s2=Text2.Text len1=Len(s1) len2=Len(s2) minlen=____①____ ′minlen中保存s1和s2中较短字符串的长度 ans=0 Fori=1Tolen1 Forj=1Tolen2 cnt=0: x=i: y=j DoWhile ____②____Andcnt cnt=cnt+1 x=xModlen1+1 y=yModlen2+1 Loop If ____③____Thenans=cnt Nextj Nexti Label3.Caption=Str(ans) EndSub 解析 用x和y分别记录s1和s2中正在比较的字符的位置,通过对字符串长度求余,巧妙地回到第一个字符的位置,实现了字符环的功能。 注意: 因为字符串的下标从1开始,故不能写作x=(x+1)Modlen1。 答案 (1)5 (2)①getmin(len1,len2) ②Mid(s1,x,1)=Mid(s2,y,1) ③cnt>ans 【变式训练2】编写VB程序,实现如下功能: 在文本框Text1中输入当天对应的星期,文本框Text2中输入天数,单击“推算”按钮Command1,推算出相应天数后的星期情况,并在标签Label1中输出结果。 界面如图所示。 (1)为实现上述功能,请在划线处填入合适的代码。 PrivateSubCommand1_Click() DimxAsString,xqAsString,numAsInteger DimiAsInteger,hAsInteger x=“日一二三四五六” xq=Text1.Text i=1 num=Val(Text2.Text) Fori=1ToLen(x) Ifxq=Mid(x,i,1)Thenh=i: ExitFor Nexti _____①____ Label1.Caption=“星期”+Mid(x,r,1) EndSub (2)若当天是“星期五”,在文本框Text2中输入“166”,单击“推算”按钮后,标签Label1中显示的内容是________。 解析 先找出今天在星期中的位置,但构成环,需用0-(n-1)来表示,因此输入五,获得位置6,但用5来表示,加上166=171,171Mod7=3,表达成字符串还加1,应用星期三。 答案 (1)①r=(h+num-1)Mod7+1 (2)星期三 一、选择题 1.有如下VB程序段: Fori=4To3Step-1 Ifa(i) tmp=a(i) Forj=i-1To1Step-1 Iftmp>a(j)ThenExitFor a(j+1)=a(j) Nextj a(j+1)=tmp EndIf Nexti 数组元素a (1)到a(6)的值依次为“19,8,96,92,85,88”,经过该程序段“加工”后,数组元素a (1)到a(6)的值依次为( ) A.8,19,92,96,85,88B.8,19,85,88,92,96 C.19,8,92,96,85,88D.19,8,85,92,96,88 解析 变量i从第4个位置开始,如果小于他前面的数,时行插入排序,结果为19,8,92,96,85,88,当i=3时,条件不满足。 答案 C 2.小张编写程序,实现把数据temp插入到升序序列中,得到一个新的升序序列,原升序序列各元素已依次存放在数组元素a (1)、a (2)、a(3)、……、a(n)中。 他编写的VB程序段如下: Iftemp>=a(n)Then a(n+1)=temp Else j=n DoWhilej>=1Andtemp ____①____ j=j-1 Loop ____②____ EndIf 要使程序实现上述功能,则方框①②中的语句分别是( ) A.①a(j+1)=a(j) ②a(j+1)=temp B.①a(j)=a(j-1) ②a(j+1)=temp C.①a(j+1)=a(j) ②a(j)=temp D.①a(j)=a(j-1) ②a(j)=temp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高考专题复习专题九 其他常用算法信息技术 高考 专题 复习 其他 常用 算法 信息技术