第二十届全国青少年信息学奥林匹克竞赛初赛提高组C语言试题一、单项选择题(每题1.5分,共22.5分)。1.以下哪个是面向对象的高级语言().A.汇编语言B.C++C.FORTRAND.Basic2.1TB代表的字节数量是().A.2的10次方B.2的20次方C.2的30次方D.2的40次方3.二进制数00100100和00010101的和是().A.00101000B.001010100C.01000101D.001110014.TCP协议属于哪一层协议().A.应用层B.传输层C.网络层D.数据链路层5.下列几个32位IP地址中,书写错误的是().A.162.105.128.27B.192.168.0.1C.256.256.129.1D.10.0.0.16.在无向图中,所有定点的度数之和是边数的()倍.A.0.5B.1C.2D.47.对长度位n的有序单链表,若检索每个元素的概率相等,则顺序检索到表中任一元素的平均检索长度为().A.n/2B.(n+1)/2C.(n-1)/2D.n/48.编译器的主要功能是().A.将一种高级语言翻译成另一种高级语言B.将源程序翻译成指令C.将低级语言翻译成高级语言D.将源程序重新组合9.二进制数111.101所对应的十进制数是().A.5.625B.5.5C.6.125D.7.62510.若有变量inta,floatx,y,且a=7,x=2.5,y=4.7,则表达式x+a%3*(int)(x+y)%2/4的值大约是().A.2.500000B.2.750000C.3.500000D.0.00000011.有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向一个链表中的三个续结点。structnode{datanextdatanextdatanextintdata;structnode*next;↑p↑q↑r}*p,*q,*r;现要将q和r所指结点的先后位置交换,同时要保持链表的连续,以下程序段中错误的是().A.q-next=r-next;p-next=r;r-next=q;B.p-next=r;q-next=r-next;r-next=q;C.q-next=r-next;r-next=q;p-next=r;D.r-next=q;q-next=r-next;p-next=r;12.同时查找2n个数中的最大值和最小值,最少比较次数为().A.3(n-2)/2B.4n-2C.3n-2D.2n-213.设G是有6个结点的完全图,要得到一颗生成树,需要从G中删去()条边.A.6B.9C.10D.1514.以下时间复杂度不是O(n2)的排序方法是().A.插入排序B.归并排序C.冒泡排序D.选择排序15.以下程序实现了找第二小元素的算法。输入时n个不等的数构成的数组S,输出S中第二小的数SecondMin。在最坏的情况下,该算法需要做()次比较。if(S[1]S[2]){FirstMin=S[1];SecondMin=S[2];}else{FirstMin=S[2];SecondMin=S[1];}for(i=3;i=n;i++)if(S[1]SecondMin)if(S[1]FirstMin){SecondMin=FirstMin;FirstMin=S[1];}else{SecondMin=S[1];}A.2nB.n-1C.2n-3D.2n-2二、不定项选择题(每题1.5分,共7.5分)。1.若逻辑变量A、C为真,B、D为假,以下逻辑运算表达式真的有().A.(B∨C∨D)∨D∧AB.((-A∧B)∨C)∧BC.(A∧B)∨(C∧D∨-A)D.A∧(D∨-C)∧B2.下列()软件属于操作系统软件。A.MicrosoftWordB.WindowsXPC.AndroidD.MacOSXE.Oracle3.在NOI比赛中,对于程序设计题,选手提交的答案不得包含下列哪些内容().A.试图访问网络B.打开或创建题目规定的输入/输出文件之外的其他文件C.运行其他程序D.改变文件系统的访问权限E.读写文件系统的管理信息4.以下哪些结构可以用来存储图().A.邻接矩阵B.栈C.邻接表D.二叉树5.下列各无符号十进制整数中,能用八位二进制表示的数有().A.296B.133C.256D.199三、问题求解。1.有数字1,1,2,4,8,8所组成的不同的四位数的个数是_____.2.如图所示,图中每条边上的数字表示该边的长度,则从A到E的最短距离是_____.四、阅读程序写结果(共4题,每题8分,共32分)。1.#includestdio.hintmain(){inta,b,I,tot,c1,c2;scanf(“%d%d”,&a,&d);tot=0;for(i=a;i=b;i++){c1=i/10;c2=i%10;if((c1+c2)%3==0)tot++;}Printf(“%d\n,tot);Return0;}输入:731输出:_________2.#includestdio.hIntfun(intn,intminNum,intmaxNum){inttot,i;if(n==0)retuen1;tot=0;for(i=minNum;i=maxNum;i++)tot+=fun(n-1,i=1,maxNum);returntot;}intmian(){intn,m;Scanf(“%d%d”,&n,&m);printf(“%d\n”,fum(m,1,n));return0;}输入:63输出:________3.#includestdio.h#includestring.hconstintSIZE=100;constintLENGTH=25;//strcmp(a,b)0:a的字典序小于b//strcmp(a,b)=1:a和b一样//strcmp(a,b)0:a的字典序大于bintmain()chardict[SIZE][LENGTH+1];intrank[SIZE];intind[SIZE];inti,j,n,tmp;scanf(“%d”,&n);for(i=1;i=n;i++){rank[i]=iind[i]=i;scanf(“%s”,dict[i]);}for(i=1;in;i++)for(j=1;j=n-i;j++)if(strcmp(dict[ind[j]],dict[ind[j+1]])0){tmp=ind[j];ind[j]=ind[j+1];ind[j+1]=tmp;}for(i=1;i=n;i++)rank[ind[i]]=i;for(i=1:i=n;i++)ptintf(%d”,rank[i]);printf(“\n”);return0;}输入:7aaaababbbaaaaaacccaa输出:______4.#nicludestdio.hconstintSIZE=100;intalive[SIZE];intn;intnext(intnum){do{num++;if(numn)num=1;}while(alive[num]==0);returnnum;}intmain(){intm,i,j,num;scanf(“%d%d”,&n,&m);for(i=1;i=n;i++)alive[i]=1;num=1;for(i=1;i=n;j++){for(j+1;j=m;j++)num=next(num);printf(“%d”,num);alive[num]=0;if(in)num=next(num);}printf(\n);return0;}输入:113输出:_________五、完善程序1.(双栈模拟数组)只使用两个栈结构stack1和stack2,模拟对数组的随机读取。作为栈结构,stack1和stack2只能访问栈顶(最后一个有效元素)。栈顶指针top1和top2均指向栈顶元素的下一个位置。输入第一行包含的两个整数,分别是数组长度n和访问次数m,中间用单个空格隔开。第二行包含n个整数,一次歌出数组各项(数组下标从0到a-1)。第三行包含m个整数,需要访问的数组下标。对于每次访问,输出对应的数组元素。#includestdio.hconsrintSIZE=100;intstack1[SIZE],stack2[SIZE];inttop1,top2;intn,m,i,j;voidclearStack(){intI;for(i=top1;iSIZE;i++)stack[i]=0;for(i=top2;iSIZE;i++)stack[i]=0;}intmain()scanf(%d,%d”,&n,&m);for(i=0in;i++)scanf(“%d”,&stack1[i]);top1=_____(1)______;top2=_______(2)____;for(j=0jm;j++){scanf(“%d”,&i);while(itop1-1){top1--;(3);top2++;}while(itop1-1){top2--;(4);top1++;}clearstack();printf(“%d\n”,stack1[(5)]);}return0;}2.(最大矩阵和)给出M行N列的整数矩阵,就最大的子矩阵和(子矩阵不能为空)。输入第一行包含两个整数M和N,即矩阵的行数和列数。之后M行,每行N个整数,描述整个矩阵。程序最终输出最大的子矩阵和。(第一空2分,其余3分,共14分)#includestdio.hconstintSIZE=100;intmatrix[SIZE+1][SIZE+1];introwsum[SIZE+1][SIZE+1];//rowsum[i][j]记录第i行前j个数的和intm,n,i,j,first,last,area,ans;intmain(){scanf(“%d%d”,&m,&n);for(i=1;i=m;i++)for(j=1;j=n;j++)scanf(“%d”,&matrix[i][j]);ans=matrix(1);for(i=1;i=m;i++)(2);for(i=1;i=m;i++)for(j=1;j=n;j++)rowsum[i][j]=(3);for(first=1;first=n;first++)for(last=first;last=n;last++){(4);for(i=1;i=m;i++){area+=(5);if(areaans)ans=area;if(area0)area=0;}}printf(“%d\n”,ans);return0;}二、问题求解(共2题,每题4分,共计8分;每题全部答对得4分)1.________102___________2.________15____________三、阅读程序写结果(共4题,每题8分,共计32分)1._________8__________2.__________20__________3.___2563471____4._3691510411827_四、完善程序(共2题,每题10分,共计20分)1.(1)________________________n__________________________(2分)(2)_________________________0___________________________(2分)(3)_______________stack2[top2]=stack1[top1]____________(2分)(4)______________stack1[top1]=stack2[top2]_____________(2分)(5)________________________top1-1______________________(2分)2.(1)________________________[1][1]_________________