NOIP提高组初赛试题.docx
《NOIP提高组初赛试题.docx》由会员分享,可在线阅读,更多相关《NOIP提高组初赛试题.docx(10页珍藏版)》请在冰豆网上搜索。
NOIP提高组初赛试题
第十三届全国青少年信息学奥林匹克联赛初赛试题
提高组C语言
一、单项选择题(共10题,每题1.5分,共计15分。
每题有且仅有一个正确答案)。
1.在以下各项中,()不是CPU的组成部分。
A.控制器B.运算器C.寄存器D.主板E.算术逻辑单元(ALU)
2.在关系数据库中,存放在数据库中的数据的逻辑结构以()为主。
A.二叉树B.多叉树C.哈希表D.B+树E.二维表
3.在下列各项中,只有()不是计算机存储容量的常用单位。
A.ByteB.KBC.MBD.UBE.TB
4.ASCII码的含义是()。
A.二—十进制转换码B.美国信息交换标准代码C.数字的二进制编码
D.计算机可处理字符的唯一编码E.常用字符的二进制编码
5.在C语言中,表达式23|2^5的值是()
A.23B.1C.18D.32E.24
6.在C语言中,判断a等于0或b等于0或c等于0的正确的条件表达式是()
A.!
((a!
=0)||(b!
=0)||(c!
=0))B.!
((a!
=0)&&(b!
=0)&&(c!
=0))
C.!
(a==0&&b==0)||(c!
=0)D.(a=0)&&(b=0)&&(c=0)
E.!
((a=0)||(b=0)||(c=0))
7.地面上有标号为A、B、C的3根细柱,在A柱上放有10个直径相同中间有孔的圆盘,从上到下依次编号为1,2,3,……,将A柱上的部分盘子经过B柱移入C柱,也可以在B柱上暂存。
如果B柱上的操作记录为:
“进,进,出,进,进,出,出,进,进,出,进,出,出”。
那么,在C柱上,从下到上的盘子的编号为()。
A.243657B.241257C.243176
D.243675E.214375
8.与十进制数17.5625对应的8进制数是()。
A.21.5625B.21.44C.21.73D.21.731E.前4个答案都不对
9.欧拉图G是指可以构成一个闭回路的图,且图G的每一条边恰好在这个闭回路上出现一次(即一笔画成)。
在以下各个描述中,不一定是欧拉图的是()。
A.图G中没有度为奇数的顶点
B.包含欧拉环游的图(欧拉环游是指通过图中每边恰好一次的闭路径)
C.包含欧拉闭迹的图(欧拉迹是指通过图中每边恰好一次的路径)
D.存在一条回路,通过每个顶点恰好一次E.本身为闭迹的图
10.一个无法靠自身的控制终止的循环称为“死循环”,例如,在C语言程序中,语句“while
(1)printf(“*”);”就是一个死循环,运行时它将无休止地打印*号。
下面关于死循环的说法中,只有()是正确的。
A.不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,任何编译系统都不做死循环检验
B.有些编译系统可以检测出死循环
C.死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环
D.死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也是可以检测的
E.对于死循环,只能等到发生时做现场处理,没有什么更积极的手段
二、不定项选择题(共10题,每题1.5分,共计15分。
每题正确答案的个数大于或等于1。
多选或少选均不得分)。
11.设A=B=true,C=D=false,以下逻辑运算表达式值为真的有()。
A.(¬A∧B)∨(C∧D∨A)B.¬(((A∧B)∨C)∧D)
C.A∧(B∨C∨D)∨DD.(A∧(D∨C))∧B
12.命题“P→Q”可读做P蕴涵Q,其中P、Q是两个独立的命题。
只有当命题P成立而命题Q不成立时,命题“P→Q”的值为false,其他情况均为true。
与命题“P→Q”等价的逻辑关系式是()。
A.¬P∨QB.P∧QC.¬(P∨Q)D.¬(¬Q∧P)
13.(2070)16+(34)8的结果是()。
A.(8332)10B.(208C)16C.(100000000110)2D.(20214)8
14.已知7个结点的二叉树的先根遍历是1245637(数字为结点的编号,以下同),后根遍历是4652731,则该二叉树的可能的中根遍历是()
A.4265173B.4256137
C.4231547D.4256173
15.冗余数据是指可以由其他数据导出的数据,例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。
冗余数据往往会造成数据的不一致,例如,上面4个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。
下面关于冗余数据的说法中,正确的是()。
A.应该在数据库中消除一切冗余数据
B.与用高级语言编写的数据处理系统相比,用关系数据库编写的系统更容易消除冗余数据
C.为了提高查询效率,在数据库中可以适当保留一些冗余数据,但更新时要做相容性检验
D.做相容性检验会降低效率,可以不理睬数据库中的冗余数据
16.在下列各软件中,属于NOIP竞赛(复赛)推荐使用的语言环境有()。
A.gccB.g++C.TurboCD.freepascal
17.以下断电之后仍能保存数据的有()。
A.硬盘BROMC.显存D.RAM
18.在下列关于计算机语言的说法中,正确的有()。
A.高级语言比汇编语言更高级,是因为它的程序的运行效率更高
B.随着Pascal、C等高级语言的出现,机器语言和汇编语言已经退出了历史舞台
C.高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上
D.C是一种面向过程的高级计算机语言
19.在下列关于算法复杂性的说法中,正确的有()。
A.算法的时间复杂度,是指它在某台计算机上具体实现时的运行时间
B.算法的时间复杂度,是指对于该算法的一种或几种主要的运算,运算的次数与问题的规模之间的函数关系
C.一个问题如果是NPC类的,就意味着在解决该问题时,不存在一个具有多项式时间复杂度的算法。
但这一点还没有得到理论上的证实,也没有被否定
D.一个问题如果是NP类的,与C有相同的结论
20.近20年来,许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力的工具。
在下列关于递归算法的说法中,正确的是()。
A.在1977年前后形成标准的计算机高级语言“FORTRAN77”禁止在程序使用递归,原因之一是该方法可能会占用更多的内存空间
B.和非递归算法相比,解决同一个问题,递归算法一般运行得更快一些
C.对于较复杂的问题,用递归方式编程往往比非递归方式更容易一些
D.对于已经定义好的标准数学函数sin(x),应用程序中的语句“y=sin(sin(x));”就是一种递归调用
三.问题求解(共2题,每题5分,共计10分)
1.给定n个有标号的球,标号依次为1,2,…,n。
将这n个球放入r个相同的盒子里,不允许有空盒,其不同放置方法的总数记为S(n,r)。
例如,S(4,2)=7,这7种不同的放置方法依次为{
(1),(234)},{
(2),(134)},{(3),(124)},{(4),(123)},{(12),(34)},{(13),(24)},{(14),(23)}。
当n=7,r=4时,S(7,4)=_____________。
2.N个人在操场里围成一圈,将这N个人按顺时针方向从1到N编号,然后,从第一个人起,每隔一个人让下一个人离开操场,显然,第一轮过后,具有偶数编号的人都离开了操场。
依次做下去,直到操场只剩下一个人,记这个人的编号为J(N),例如,J(5)=3,J(10)=5,等等。
则J(400)=______________。
(提示:
对N=2m+r进行分析,其中0≤r<2m)。
四.阅读程序写结果(共4题,每题8分,共计32分)
1.#include
intmain()
{inti,p[5],q[5],x,y=20;
for(i=0;i<=4;i++)
scanf("%d",&p[i]);
q[0]=(p[0]+p[1])+(p[2]+p[3]+p[4])/7;
q[1]=p[0]+p[1]/((p[2]+p[3])/p[4]);
q[2]=p[0]*p[1]/p[2];
q[3]=q[0]*q[1];
q[4]=q[1]+q[2]+q[3];
x=(q[0]+q[4]+2)-p[(q[3]+3)%4];
if(x>10)
y+=(q[1]*100-q[3])/(p[p[4]%3]*5);
else
y+=20+(q[2]*100-q[3])/(p[p[4]%3]*5);
printf("%d,%d\n",x,y);
return0;
}
/*注:
本例中,给定的输入数据可以避免分母为0或数组元素下标越界。
*/
输入:
66553
输出:
_______________
2.#include
voidfun(int*a,int*b)
{int*k;
k=a;a=b;b=k;
}
main()
{inta=3,b=6,*x=&a,*y=&b;
fun(x,y);
printf("No.1:
%d,%d",a,b);
fun(&a,&b);
printf("No.2:
%d,%d\n",a,b);
}
输出:
____________________
3.#include"math.h"
#include"stdio.h"
main()
{inta1[51]={0};
inti,j,t,t2,n=50;
for(i=2;i<=sqrt(n);i++)
if(a1[i]==0)
{t2=n/i;
for(j=2;j<=t2;j++)a1[i*j]=1;
}
t=0;
for(i=2;i<=n;i++)
if(a1[i]==0)
{printf("%4d",i);t++;
if(t%10==0)printf("\n");
}
printf("\n");
}
输出:
________________________________________
________________________________________
4.#include"stdio.h"
charch[]={'q','A','S','O','R','T','E','X','A','M','P','L','E'};
intn=12;
voidshift(intk,intn)
{charv;
intj;
v=ch[k];j=k+k;
while(j<=n)
{if((jif(v{ch[j/2]=ch[j];j*=2;}
else
return;
ch[j/2]=v;
}
}
voidhpsrt(void)
{intk;
chartmp;
for(k=n/2;k>0;k--)shift(k,n);/*建堆*/
printf("No.1:
");
for(k=1;k<=n;k++)putchar(ch[k]);
putchar('\n');
for(k=n;k>0;k--)
{tmp=ch[1];ch[1]=ch[k];ch[k]=tmp;
shift(1,k-1);
}
}
main()
{intk;
hpsrt();
printf("No.2:
");
for(k=1;k<=n;k++)putchar(ch[k]);
putchar('\n');
}
输出:
__________________________________________
___________________________________________
五.完善程序(前5空,每空2分,后6空,每空3分,共28分)
1.(格雷码,GrayCode)格雷码是对十进制数的一种二进制编码。
编码顺序与相应的十进制数的大小不一致。
其特点是:
对于两个相邻的十进制数,对应的两个格雷码只有一个二进制位不同。
另外,最大数与最小数之间也仅有一个二进制位不同,以4位二进制数为例,编码如下:
十进制数格雷码
0000081100
1000191101
20011101111
30010111110
40110121010
50111131011
60101141001
70100151000
如果把每个二进制的位看作一个开关,则将一个数变为相邻的另一个数,只须改动一个开关。
因此,格雷码广泛用于信号处理、数-模转换等领域。
下面程序的任务是:
由键盘输入二进制数的位数n(n<16),再输入一个十进制数m(0≤m<2n),然后输出对应于m的格雷码(共n位,用数组gr[]存放)。
为了将程序补充完整,你必须认真分析上表的规律,特别是对格雷码固定的某一位,从哪个十进制数
起,由0变为1,或由1变为0。
#include
main()
{intbound=1,m,n,i,j,b,p,gr[15];
printf("inputn,m\n");
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)bound=①;
if(m<0||m>=bound)
{printf("Dataerror!
\n");
②;
}
b=1;
for(i=1;i<=n;i++)
{p=0;b=b*2;
for(③;j<=m;j++)
if(④)
p=1-p;
gr[i]=p;
}
for(i=n;⑤)
printf("%1d",gr[i]);/*在"%1d"中出现的是数字1,不是字母l*/
printf("\n");}
2.(连续邮资问题)某国发行了n种不同面值的邮票,并规定每封信最多允许贴m张邮票,在这些约束下,为了能贴出{1,2,3,…,maxvalue}连续整数集合的所有邮资,并使maxvalue的值最大,应该如何设计各邮票的面值?
例如,当n=5、m=4时,面值设计为{1,3,11,15,32},可使maxvalue达到最大值70(或者说,用这些面值的1至4张邮票可以表示不超过70的所有邮资,但无法表示邮资71。
而用其他面值的1至4张邮票如果可以表示不超过k的所有邮资,必有k≤70)。
下面是用递归回溯求解连续邮资问题的程序。
数组x[1:
n]表示n种不同的邮票面值,并约定各元素按下标是严格递增的。
数组bestx[1:
n]存放使maxvalue达到最大值的邮票面值(最优解),数组y[maxl]用于记录当前已选定的邮票面值x[1:
i]能贴出的各种邮资所需的最少邮票张数。
请将程序补充完整。
#include
#defineNN20
#definemaxint30000
#definemaxl500/*邮资的最大值*/
intn,m,bestx[NN],x[NN],y[maxl],maxvalue=0;
voidresult()
{输出结果:
最大值:
maxvalue及最优解:
bestx[1:
n](略)
}
voidbacktrace(inti,intr)
{intj,k,z[maxl];
for(j=0;j<=①;j++)
if(y[j]for(k=1;k<=m-y[j];k++)
if(y[j]+k<=y[②])
y[③]=y[j]+k;
while(y[r]if(i>n)
{if(r-1>maxvalue)
{maxvalue=④;
for(j=1;j<=n;j++)
bestx[j]=x[j];
}
return;
}
for(k=0;kz[k]=y[k];
for(j=⑤;j<=r;j++)
{x[i]=j;
⑥;
for(k=0;ky[k]=z[k];
}
}
voidmain()
{intj;
printf("inputn,m:
\n");
scanf(“%d%d”,&n,&m);
for(j=1;jy[j]=maxint;
y[0]=0;x[0]=0;x[1]=1;
backtrace(2,1);
result();
}