版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2021年程序员模拟题4卷面总分:7分答题时间:240分钟试卷题量:7题练习次数:16次
问答题(共7题,共7分)
1.阅读说明和流程图,填补流程图中的空缺(1)?(5),将答案填入答题纸对应栏内。【说明】本流程图用于计算菲波那契数列{a1=1,a2=1,…,an=an-1+an-2!n=3,4,…}的前n项(n>=2)之和S。例如,菲波那契数列前6项之和为20。计算过程中,当前项之前的两项分别动态地保存在变量A和B中。【流程图】
正确答案:
您的答案:
本题解析:(1)2或A+B(2)n(3)A+B(4)B-A(5)S+B
【解析】
菲波那契数列的特点是首2项都是1,从第3项开始,每一项都是前两项之和。该数列的前几项为1,1,2,3,5,8,…。在流程图中,送初始值1—A,2—B后,显然前2项的和S应等于2,所以(1)处应填2(或A+B)。此时2→i(i表示动态的项编号),说明已经计算出前2项之和。接着判断循环的结束条件。显然当i=n时表示已经计算出前n项之和,循环可以结束了。因此(2)处填n。判断框中用“>”或“≥”的效果是一样的,因为随着i的逐步增1,只要有i=n结束条件就不会遇到i>n的情况。不过编程的习惯使循环结束条件扩大些,以防止逻辑出错时继续循环。接下来i+1→i表示数列当前项的编号增1,继续往下计算。原来的前两项值(分别在变量A和B中)将变更成新的前两项再放到变量A和B中。
首先可以用A+B—B实现(原A)+(原B)—(新B),因此(3)处填A+B。为了填新A值(原来的B值),不能用B—A,因为变量B的内容已经改变为(原A)+(原B),而B-A正是((原A)+(原B))-(原A)=(原B),因此可以用B-A—A来实现新A的赋值。这样,(4)处填B-A。最后应是前n项和值的累加(比原来的S值增加了新B值),所以(5)处应填S+B。填完各个空后,最好再用具体的数值来模拟流程图走几个循环检查所填的结果(这是防止逻辑上出错的好办法)。
2.阅读以下问题说明、C程序和函数,将解答填入答题纸的对应栏内。
[说明]
函数count_months(DATEstart,DATEend)的功能是:计算两个给定日期之间所包含的完整月份数。
该函数先算出起止日期中所含的完整年数,再计算余下的完整月份数。规定两个相邻年份的同月同日之间的问隔为1年。例如,2007.5.30~2008.5.30的间隔为1年。若相邻两年中前一年是闰年,并且日期是2月29日,则到下一年的2月28日为1年,即2008.229-2009228的间隔为1年。
规定两个相邻月份的相同日之间的间隔为1个月,但需要特别考虑月末的特殊情况。例如,2007.1.29-2007.2.28的间隔为1个月,同理,2007.1.30、20072.28、2007.1.31-2007.228的间隔都是1个月。
计算起止日期间隔不足一年的完整月份数时,分如下两种情况:
1)起止日期不跨年度。先用终止日期的月号减去起始日期的月号得到月份数,然后再根据情况进行修正。例如,起止日期为2008.3.31~2008.9.20.通过月号算出月份数为6.修正时。通过调用函数makevalid将2008.9.31改为20089.30,与终止日期2008.920比较后,将月份数修正为5.
2)起止日期跨年度。计算方法如下例所示:对于起止日期2008.7.25~2009.3.31,先计算2008.725~2008.12.25
的月份数为5.再算出2008.1225~2009.3.25的月份数为3.因此2008.7.25~2009.3.31之间的完整月份数为8.
正确答案:
您的答案:
本题解析:
3.阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】假币问题:有n枚硬币,其中有一枚是假币,已知假币的重量较轻。现只有一个天平,要求用尽量少的比较次数找出这枚假币。【分析问题】将n枚硬币分成相等的两部分:(1)当n为偶数时,将前后两部分,即1…n/2和n/2+1…0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币:(2)当n为奇数时,将前后两部分,即1…(n-1)/2和(n+1)/2+1…0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币;若两端重量相等,则中间的硬币,即第(n+1)/2枚硬币是假币。【C代码】下面是算法的C语言实现,其中:
coins[]:硬币数组first,last:当前考虑的硬币数组中的第一个和最后一个下标
#include<stdio.h>
intgetCounterfeitCoin(intcoins[],intfirst,intlast){intfirstSum=0,lastSum=0;intì;If(first==last-1){/*只剩两枚硬币*/if(coins[first]<coins[last])returnfirst;returnlast;}
if((last-first+1)%2==0){/*偶数枚硬币*/for(i=first;i<(1);i++){firstSum+=coins[i];}for(i=first+(last-first)/2+1;i<last+1;i++){lastSum+=coins[i];}if(2){ReturngetCounterfeitCoin(coins,first,first+(last-first)/2;)}else{ReturngetCounterfeitCoin(coins,first+(last-first)/2+1,last;)}}else{/*奇数枚硬币*/For(i=first;i<first+(last-first)/2;i++){firstSum+=coins[i];}For(i=first+(last-first)/2+1;i<last+1;i++){lastSum+=coins[i];}If(firstSum<lastSum){returngetCounterfeitCoin(coins,first,first+(last-first)/2-1);}elseif(firstSum>lastSum){returngetCounterfeitCoin(coins,first+(last-first)/2-1,last);}else{Return(3)}}}
【问题一】(6分)根据题干说明,填充C代码中的空(1)-(3)【问题二】(4分)根据题干说明和C代码,算法采用了()设计策略。函数getCounterfeitCoin的时间复杂度为()(用O表示)。【问题三】(5分)若输入的硬币数为30,则最少的比较次数为(),最多的比较次数为()。
正确答案:
您的答案:
本题解析:【问题一】答案:(1)first+(last-first)/2+1或(first+last)/2+1(2)firstSum<lastSum(3)first+(last-first)/2或(first+last)/2【问题二】答案:分治法、O(nlogn)【问题三】答案:2、4
4.阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树。(1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值。(2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值。(3)左、右子树本身就是两棵二叉查找树。二叉查找树是通过依次输入数据元素并把它们插入到二叉树的适当位置上构造起来的,具体的过程是:每读入一个元素,建立一个新结点,若二叉查找树非空,则将新结点的值与根结点的值相比较,如果小于根结点的值,则插入到左子树中,否则插入到右子树中;若二叉查找树为空,则新结点作为二叉查找树的根结点。根据关键码序列{46,25,54,13,29,91}构造一个二叉查找树的过程如图4-1所示。
设二叉查找树采用二叉链表存储,结点类型定义如下:
typedefintKeyType;typedefstructBSTNode{KeyTypekey;structBSTNode*left,*right;}BSTNode,*BSTree;
图4-1(g)所示二叉查找树的二叉链表表示如图4-2所示。
函数intInsertBST(BSTree*rootptr,KeyTypekword)功能是将关键码kword插入到由rootptr指示出根结点的二叉查找树中,若插入成功,函数返回1,否则返回0。【C代码】
intlnsertBST(BSTree*rootptr,KeyTypekword)/*在二叉查找树中插入一个键值为kword的结点,若插入成功返回1,否则返回0;*rootptr为二叉查找树根结点的指针*/{BSTreep,father;(1)/*将father初始化为空指针*/p=*rootptr;/*p指示二叉查找树的根节点*/while(p&&(2)){/*在二叉查找树中查找键值kword的结点*/father=p;if(kword<p->key)p=p->left;elsep=p->right;}if((3))return0;/*二叉查找树中已包含键值kword,插入失败*/p=(BSTree)malloc((4));/*创建新结点用来保存键值kword*/If(!p)return0;/*创建新结点失败*/p->key=kword;p->left=NULL;p->right=NULL;If(!father)(5)=p;/*二叉查找树为空树时新结点作为树根插入*/elseif(kword<father->key)(6);/*作为左孩子结点插入*/else(7);/*作右孩子结点插入*/return1;}/*InsertBST*/
正确答案:
您的答案:
本题解析:father=(void*)0keyword!=p-keypsizeof(BSTNode)*rootptrfather-left=pfather-right=p
5.阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。【说明】直接插入排序是一种简单的排序方法,具体做法是:在插入第i个关键码时,k1,k2,…,ki-1已经排好序,这时将关键码ki依次与关键码ki-1,ki-2,…,进行比较,找到ki应该插入的位置时停下来,将插入位置及其后的关键码依次向后移动,然后插入ki。例如,对{17,392,68,36}按升序作直接插入排序时,过程如下:第1次:将392(i=1)插入有序子序列{17},得到{17,392};第2次:将68(i=2)插入有序子序列{17,392},得到{17,68,392};第3次:将36(i=3)插入有序子序列{17,68,392},得到{17,36,68,392},完成排序。下面函数insertSort用直接插入排序对整数序列进行升序排列,在main函数中调用insertSort并输出排序结果。【C代码】voidinsertSort(intdata[],intn)/*用直接插入排序法将data[0]~data[n-1]中的n个整数进行升序排列*/{inti,j;inttmp;for(i=1;i<n;i++){if(data[i]<data[i-1]){//将data[i]插入有序子序列data[0]~data[i-1]tmp=data[i];//备份待插入的元素data[i]=(1);for(j=i-2;j>=0&&data[j]>tmp;j----)//查找插入位置并将元素后移(2);(3)=tmp;//插入正确位置}/*if*/}/*for*/}/*insertSort*/intmain(){int*bp,*ep;intn,arr[]={17,392,68,36,291,776,843,255};n=sizeof(arr)/sizeof(int);insertSort(arr,n);bp=(4);ep=arr+n;for(;bp<ep;bp++)//按升序输出数组元素printf("%d\t",(5));return0;阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。【说明】直接插入排序是一种简单的排序方法,具体做法是:在插入第i个关键码时,k1,k2,…,ki-1已经排好序,这时将关键码ki依次与关键码ki-1,ki-2,…,进行比较,找到ki应该插入的位置时停下来,将插入位置及其后的关键码依次向后移动,然后插入ki。例如,对{17,392,68,36}按升序作直接插入排序时,过程如下:第1次:将392(i=1)插入有序子序列{17},得到{17,392};第2次:将68(i=2)插入有序子序列{17,392},得到{17,68,392};第3次:将36(i=3)插入有序子序列{17,68,392},得到{17,36,68,392},完成排序。下面函数insertSort用直接插入排序对整数序列进行升序排列,在main函数中调用insertSort并输出排序结果。【C代码】voidinsertSort(intdata[],intn)/*用直接插入排序法将data[0]~data[n-1]中的n个整数进行升序排列*/{inti,j;inttmp;for(i=1;i<n;i++){if(data[i]<data[i-1]){//将data[i]插入有序子序列data[0]~data[i-1]tmp=data[i];//备份待插入的元素data[i]=(1);for(j=i-2;j>=0&&data[j]>tmp;j----)//查找插入位置并将元素后移(2);(3)=tmp;//插入正确位置}/*if*/}/*for*/}/*insertSort*/intmain(){int*bp,*ep;intn,arr[]={17,392,68,36,291,776,843,255};n=sizeof(arr)/sizeof(int);insertSort(arr,n);bp=(4);ep=arr+n;for(;bp<ep;bp++)//按升序输出数组元素printf("%d\t",(5));return0;}
正确答案:
您的答案:
本题解析:(1)data[i-1](2)data[j+1]=data[j](3)data[j+1](4)arr(5)*bp
【解析】
直接插入排序法是将关键码插入已经排好的序列中,因此将data[i]插入序列data[0]~data[i-1]中,此时序列data[0]~data[i-1]已经按照升序排列好,而data[i]应插入位置前的数据应该比data[i]小,而插入位置后的数据应比data[i]大,在if语句中判断data[i]<data[i-1]中可以看出,在进行插入运算时,是从序列data[0]~data[i-1]最后一个数据data[i-1]向前逐一进行比较,若data[i]>=data[i-1],则将data[i]插入到d[i-1]后;若data[i]<data[i-1],data[i]需要与data[i-2]进行比较,如此依次进行,此时需要将data[i]备份并将data[i-1]后移,即temp=data[i];data[i]=data[i-1];之后是进行比较,即for(j=i-2;j>=0&&data[j]>tmp;j--)循环,从data[i-2]开始向前逐一比较,即j从i-2开始向0循环,若data[j]>tmp,则进行for循环,此时需要将data[j]即data[i-2]的值后移,使得data[i-1]=data[i-2],即data[j+1]=data[j],然后j--,用tmp与data[j]进行比较,如果tmp<data[j],则说明tmp应放在data[j]之前,那么data[j]需要继续往后移动。所以data[j+1]=data[j]。当该循环结束时,此时有2种情况:(1)j=-1<0,此时data[0]>tmp;应使得data[0]后移,即data[1]=data[0],data[0]=tmp,因此第3空填写data[j+1];(2)data[j]<=tmp;此时需要将tmp插入到data[j]后,即data[j+1]=tmp。在main函数中调用insertSort函数并输出数组元素,在for(;bp<ep;bp++)中循环变量是bp,因此输出的是bp指向的数组元素,即调用insertSort函数后返回的数组arr,因此bp=arr(bp是指针变量,数组名arr可以直接将数组地址传递给bp);在printf函数中输出bp;因此printf(“%d\n”,*bp)。
6.阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。【说明】如果一个自然数N恰好等于它所有不同的真因子(即N的约数以及1,但不包括N)之和S,则称该数为“完美数”。例如6=1+2+3,28=1+2+4+7+14,所以6和28都是完美数。显然,6是第1个(即最小的)完美数。下面流程图的功能是求500以内所有的完美数。【流程图】
循环开始框中要注明:循环变量=初始值,终值[,步长],步长为1时可以缺省。如果某自然数小于其所有真因子之和(例如24<1+2+3+4+6+8+12),则称该自然数为亏数;如果某自然数大于其所有真因子之和(例如8>1+2+4),则称该自然数为贏数;如果某自然数等于从1开始的若干个连续自然数之和(例如10=1+2+3+4)则称该自然数为三角形数。据此定义,自然数496是()。供选择答案:A.亏数B.赢数C.完美数,非三角形数D.完美数和三角形数
正确答案:
您的答案:
本题解析:(1)2(2)N%K(3)S+K(4)S(5)D
【解析】
流程图的功能是求500以内所有的完美数,N的值范围是6~500,因此N是需要判断是否为完美数,首先需要求出N的所有真因子,然后再判断N和真因子之和是否相等,从流程图可以看出S是保存真因子和的变量,K是保存真因子的变量,因此K的初始值是2,终值是N/2,因此第(1)空处填写:2;判断K是否为N的真因子,即判断N%K(N除以K取余)是否为0,第(2)空填写:N%K;当K为N的真因子时,需要计算所有K的和,即S=S+K,第(3)空填写:S+K;最后判断N和S是否相等,第(4)空填写:S。496的真因子有:1、2、4、8、16、31、62、124、248,1+2+4+8+16+31+62+124+248=496;因此496是完美数,同时496=(1+2+3+4+……+30+31),因此496是完美数和三角形数。
7.阅读以下C++代码,填充(1)~(5)的空缺,将解答填入答题纸的对应栏内。【说明】在下面程序横线处填上适当的字句,使其输出结果为:x=5x=6y=7x=8z=9【程序】#include<iostream.h>classX1{intx;(1):X1(intxx=0){x=xx;}(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年绿色建造技术项目可行性研究报告
- 2026年智能雨量传感器项目可行性研究报告
- 教职工考核结果运用制度
- 新能源发展市场前景报告
- 教师职称评审结果公示制度
- 技术人员培训与发展制度
- c 课程设计的设计总结
- 农产品质量检测留样制度
- python课程设计界面报告
- web课程设计提交课程报告
- 2025天津市个人房屋租赁合同样本
- 中药热熨敷技术及操作流程图
- 鹤壁供热管理办法
- 01 华为采购管理架构(20P)
- 糖尿病逆转与综合管理案例分享
- 工行信息安全管理办法
- 娱乐场所安全管理规定与措施
- 化学●广西卷丨2024年广西普通高中学业水平选择性考试高考化学真题试卷及答案
- 人卫基础护理学第七版试题及答案
- 烟草物流寄递管理制度
- 被打和解协议书范本
评论
0/150
提交评论