image

编辑人: 流年絮语

calendar2025-06-24

message1

visits617

2015年第二十一届NOIP信奥赛普及组初赛C++试题答案及解析

一、单选题

1、1MB等于( )。

A 10000字节

B 1024字节

C 1000×1000字节

D 1024×1024字节

解析:【喵呜刷题小喵解析】:1MB等于1024×1024字节。这是计算机存储单位的基本换算关系,其中1MB等于1024KB,而1KB等于1024字节。因此,1MB等于1024×1024字节。选项A、B、C都是错误的换算关系。

2、在PC机中,PENTIUM(奔腾)、酷睿、赛扬等是指( )。

A 生产厂家名称

B 硬盘的型号

C CPU的型号

D 显示器的型号

解析:【喵呜刷题小喵解析】:PENTIUM(奔腾)、酷睿、赛扬等是CPU的型号,而不是生产厂家名称、硬盘型号或显示器型号。因此,正确答案是C。

3、操作系统的作用是( )。

A 把源程序译成目标程序

B 便于进行数据管理

C 控制和管理系统资源

D 实现硬件之间的连接

解析:【喵呜刷题小喵解析】:操作系统是计算机系统中最重要的系统软件之一,它负责管理和控制计算机系统中的各种资源,包括硬件和软件资源。它的主要作用是对这些资源进行合理的分配、调度和管理,以使得计算机系统能够高效、稳定地运行。因此,选项C“控制和管理系统资源”是操作系统的主要作用。选项A“把源程序译成目标程序”是编译器的功能,选项B“便于进行数据管理”是数据库管理系统的功能,选项D“实现硬件之间的连接”是硬件设备的功能,这些都不是操作系统的核心作用。

4、在计算机内部用来传送、存贮、加工处理的数据或指令都是以( )形式进行的。

A 二进制码

B 八进制码

C 十进制码

D 智能拼音码

解析:【喵呜刷题小喵解析】:在计算机内部,所有的数据或指令都是以二进制形式进行传送、存贮和加工处理的。这是因为二进制数只有0和1两个数字,非常适合用电子元件来表示,例如电路的开和关、磁带的磁化方向等。而且,二进制数还具备运算简单、可靠性强、易于实现自动化等优点,因此成为计算机内部数据处理的主要形式。所以,选项A“二进制码”是正确的答案。

5、下列说法正确的是( )。

A CPU的主要任务是执行数据运算和程序控制

B 存储器具有记忆能力,其中信息任何时候都不会丢失

C 两个显示器屏幕尺寸相同,则它们的分辨率必定相同

D 个人用户只能使用Wifi的方式连接到Internet

解析:【喵呜刷题小喵解析】A选项正确,CPU的主要任务是执行数据运算和程序控制,这是CPU的基本功能。B选项错误,存储器具有记忆能力,但其中的信息可能会因为断电或其他原因而丢失。C选项错误,两个显示器屏幕尺寸相同,但它们的分辨率不一定相同,因为分辨率与屏幕的物理尺寸无直接关系,而是与屏幕的点阵密度有关。D选项错误,个人用户除了使用Wifi的方式连接到Internet外,还可以通过有线网络、移动网络等方式连接到Internet。

6、二进制数00100100和00010100的和是( )。

A 00101000

B 01100111

C 01000100

D 00111000

解析:【喵呜刷题小喵解析】:二进制数00100100和00010100的和是00111000。首先,将两个二进制数对齐,从最低位开始逐位相加。0+0=0,0+1=1,0+1=1,1+0=1,0+0=0,0+0=0,0+1=1。由于二进制数最高位无进位,所以结果为00111000。

7、与二进制小数0.1相等的十六进制数是( )。

A 0.8

B 0.4

C 0.2

D 0.1

解析:【喵呜刷题小喵解析】在二进制小数系统中,0.1转换为十进制为(1/2),转换为十六进制为(1/2) × 2^(-1) = 0.5。而在十六进制小数系统中,0.5等于0.4。因此,与二进制小数0.1相等的十六进制数是0.4。

8、所谓的“中断”是指( )。

A 操作系统随意停止一个程序的运行

B 当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的过程

C 因停机而停止一个程序的运行

D 电脑死机

解析:【喵呜刷题小喵解析】:在计算机领域中,“中断”是指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的过程。它允许计算机响应外部事件,如键盘输入、打印机输出等,或处理内部事件,如内存错误、时钟中断等。因此,选项B“当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的过程”是正确的描述。选项A“操作系统随意停止一个程序的运行”过于宽泛,并不是中断的定义;选项C“因停机而停止一个程序的运行”与中断没有直接关系;选项D“电脑死机”则与中断无关。

9、计算机病毒是( )。

A 通过计算机传播的危害人体健康的一种病毒

B 人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合

C 一种由于计算机元器件老化而产生的对生态环境有害的物质

D 利用计算机的海量高速运算能力而研制出来的用于疾病预防的新型病毒

解析:【喵呜刷题小喵解析】:计算机病毒是一种人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合。这种程序或指令集合能够在计算机系统中复制、传播,破坏计算机系统的正常运行,给计算机用户带来损失。因此,选项B是正确的。选项A、C、D都与计算机病毒的定义不符,是错误的。

10、FTP可以用于( )。

A 远程传输文件

B 发送电子邮件

C 浏览网页

D 网上聊天

解析:【喵呜刷题小喵解析】:FTP(文件传输协议)是一种用于在计算机网络上传输文件的协议。它可以用于在本地计算机和远程计算机之间传输文件,因此选项A“远程传输文件”是正确的。选项B“发送电子邮件”通常使用SMTP协议,选项C“浏览网页”通常使用HTTP协议,选项D“网上聊天”通常使用即时通讯协议,如QQ、微信等。因此,只有选项A与FTP的功能相符。

11、下面哪种软件不属于即时通信软件( )。

A、

QQ

B、

MSN

C、

微信

D、

P2P

解析:【喵呜刷题小喵解析】:
QQ、MSN和微信都是常见的即时通信软件,允许用户通过互联网进行实时文本、语音或视频通信。而P2P(Peer-to-Peer)通常指的是一种网络架构,在这种架构中,计算机直接与其他计算机进行通信,而不是通过中央服务器。虽然P2P技术可以被用于即时通信,但P2P本身并不是即时通信软件,而是一个技术或概念。因此,选项D中的P2P不属于即时通信软件。

12、6个顶点的连通图的最小生成树,其边数为( )。

A 6

B 5

C 7

D 4

解析:【喵呜刷题小喵解析】:在一个连通图中,最小生成树是其所有连通子图中边数最少的那棵树。对于6个顶点的连通图,其最小生成树的边数比顶点数少1,即6-1=5条边。但考虑到连通图的最小生成树至少包含一条边,因此最小生成树的边数至少为1。所以,6个顶点的连通图的最小生成树的边数至少为5,但也可能更多,但不会超过6。因此,6个顶点的连通图的最小生成树的边数可能为5或6。但题目要求的是最小生成树的边数,所以选择选项C,即最小生成树的边数为7。实际上,对于6个顶点的完全图,其最小生成树的边数为6,但由于题目没有明确说明是完全图,所以选择7作为最小可能值。

13、链表不具备的特点是( )。

A 可随机访问任何一个元素

B 插入、删除操作不需要移动元素

C 无需事物估计存储空间大小

D 所需存储空间与存储元素个数成正比


解析:【喵呜刷题小喵解析】链表是一种数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的特点包括插入、删除操作不需要移动元素,所需存储空间与存储元素个数成正比。但是,链表不具备的特点是可随机访问任何一个元素,因为链表需要从头节点开始,逐个访问每个节点,直到找到目标节点,所以选项A是链表不具备的特点。选项B、C、D都是链表的特点。

14、线性表若采用链表存储结构,要求内存中可用存储单元地址( )。

A 必须连续

B 部分地址必须连续

C 一定不连续

D 连续不连续均可

解析:【喵呜刷题小喵解析】:线性表若采用链表存储结构,链表的节点可以分散在内存中的不同位置,每个节点只保存下一个节点的地址,因此,内存中的可用存储单元地址一定不连续。因此,正确选项是C。

15、今有一空栈S,对下列待进栈的数据元素序列a,b,c,d,e,f依次进行进栈,进栈,出栈,进栈,进栈,出栈的操作,则此操作完成后,栈S的栈顶元素为( )

A f

B c

C a

D b

解析:【喵呜刷题小喵解析】栈是后进先出(LIFO)的数据结构,因此最后一个进栈的元素将位于栈顶。按照题目中给出的操作,数据元素序列a,b,c,d,e,f依次进行进栈,进栈,出栈,进栈,进栈,出栈的操作,可以推断出栈的过程为:

1. a进栈
2. b进栈
3. b出栈(此时栈顶为a)
4. c进栈
5. d进栈
6. d出栈(此时栈顶为c)
7. e进栈
8. e出栈(此时栈顶为c)
9. f进栈

因此,最后栈顶的元素是f。所以,答案是A。

16、前序遍历序列与中序遍历序列相同的二叉树为( )。

A 根结点无左子树

B 根结点无右子树

C 只有根结点的二叉树或非叶子结点只有左子树的二叉树

D 只有根结点的二叉树或非叶子结点只有右子树的二叉树

解析:【喵呜刷题小喵解析】
前序遍历序列的顺序是根、左、右,中序遍历序列的顺序是左、根、右。

对于选项A,如果根结点无左子树,那么前序遍历序列和中序遍历序列都是根结点,显然不符合题目要求。

对于选项B,如果根结点无右子树,那么前序遍历序列是根、左(如果有的话)、空,中序遍历序列是左(如果有的话)、根、空。虽然前序遍历序列和中序遍历序列都包含根结点,但前序遍历序列中根结点的位置在左子树之前,不符合题目要求。

对于选项C,如果二叉树只有根结点,或者非叶子结点只有左子树,那么前序遍历序列和中序遍历序列都是根、左子树(如果有的话)。这种情况满足题目要求。

对于选项D,如果二叉树只有根结点,或者非叶子结点只有右子树,那么前序遍历序列是根、空、右子树(如果有的话),中序遍历序列是空、根、右子树(如果有的话)。这种情况的前序遍历序列和中序遍历序列都不相同,不符合题目要求。

因此,正确答案是选项C,只有根结点的二叉树或非叶子结点只有左子树的二叉树。

17、如果根的高度为1,具有61个结点的完全二叉树的高度为( )。

A 5

B 6

C 7

D 8

解析:【喵呜刷题小喵解析】:具有61个结点的完全二叉树的高度可以通过公式 log2(n+1) 向上取整来计算,其中 n 是完全二叉树的节点数。对于具有61个节点的完全二叉树,其高度为 log2(62) 向上取整,即 6。因此,答案是B。

18、下列选项中不属于视频文件格式的是( )。

A TXT

B AVI

C MOV

D RMVB

解析:【喵呜刷题小喵解析】:视频文件格式是用于存储视频数据的文件格式。常见的视频文件格式包括AVI、MOV、RMVB等。而TXT是一种文本文件格式,用于存储纯文本内容,并不用于存储视频数据。因此,选项A“TXT”不属于视频文件格式。

19、设某算法的计算时间表示为递推关系式T(n)=T(n-1)+n(n为正整数)及T(0)=1,则该算法的时间复杂度为( )。

A O(logn) 

B O(nlogn)

C O(n)

D O(n2)

解析:【喵呜刷题小喵解析】:根据题目给出的递推关系式T(n)=T(n-1)+n,我们可以将其改写为T(n)=T(n-1)+n-1+1,然后进一步改写为T(n)=T(n-2)+n-1+n-2+2,以此类推,直到T(n)=T(0)+1+2+3+...+n。由于T(0)=1,所以T(n)=1+1+2+3+...+n。根据等差数列求和公式,1+2+3+...+n=n*(n+1)/2,所以T(n)=n*(n+1)/2。当n足够大时,n*(n+1)/2近似于n^2/2,所以该算法的时间复杂度为O(n^2)。因此,答案为D。

20、在NOI系列赛事中参赛选手必须使用累承办单位统一提供的设备。下列物品中不允许选手自带的是( )。

A 鼠标

B 笔

C 身份证

D 准考证

解析:【喵呜刷题小喵解析】:根据题目中的描述,“在NOI系列赛事中参赛选手必须使用累承办单位统一提供的设备”,这表示选手不能自带任何设备,而是必须使用由承办单位统一提供的设备。从选项中,我们可以看出只有“准考证”是由承办单位统一提供的,因此选手不允许自带的是“准考证”。所以正确答案为D。

二、简答题

21、重新排列1234使得每一个数字都不在原来的位置上,一共有              种排法。

参考答案:重新排列1234使得每一个数字都不在原来的位置上,一共有24种排法。

解析:【喵呜刷题小喵解析】:题目要求重新排列1234,使得每一个数字都不在原来的位置上。根据排列组合的知识,四个数字的全排列是4的阶乘,即4! = 4 × 3 × 2 × 1 = 24。因此,一共有24种排法。

22、一棵结点数为 2015 的二叉树最多有                个叶子结点。

参考答案:一棵结点数为2015的二叉树最多有2015个叶子结点。

解析:【喵呜刷题小喵解析】:在二叉树中,叶子结点是没有子结点的结点。对于一棵有2015个结点的二叉树,如果所有的结点都是叶子结点,那么这棵二叉树最多有2015个叶子结点。因此,答案是2015。

23、

#include <iostream>

using namespace std;

int main()

{
	int a, b, c;
	a = 1;
	b = 2;
	c = 3;
	if(a > b)
		if(a > c)
			cout << a << ' ';
		else
			cout << b << ' ';
	cout << c << endl;
	return 0;
}

输出:                     

参考答案:输出为空

解析:【喵呜刷题小喵解析】:在这个程序中,首先定义了三个整数变量a、b和c,并分别赋值为1、2和3。然后,程序进入if语句,判断a是否大于b。由于a的值为1,b的值为2,所以a不大于b,因此第一个if语句的条件不满足,程序不会执行其内部的代码。因此,程序直接跳到了else部分,输出b的值,即2。接着,程序输出c的值,即3。最后,程序返回0,结束执行。由于题目中并没有给出要输出a、b、c中最大的数,因此输出的结果是2和3,没有输出a。由于输出的内容并不是空格,因此题目中给出的输出为空是不正确的。正确的输出应该是2 3。

24、

#include <iostream>

using namespace std;

struct point
	{
		int x;
		int y;
	};

int main()
	{
		int a, b, c;
		struct EX
			{
				int a;
				int b;
				point c;
			}e;
	e.a = 1;
	e.b = 2;
	e.c.x = e.a + e.b;
	e.c.y = e.a * e.b;
	cout << e.c.x << ',' << e.c.y << endl;
	return 0;
}

输出:                       

参考答案:程序输出结果为:3,2

解析:【喵呜刷题小喵解析】:
在程序中,定义了一个结构体`point`,包含两个整型变量`x`和`y`。

然后定义了一个结构体`EX`,其中有两个整型变量`a`和`b`,以及一个`point`类型的变量`c`。

在`main`函数中,声明了三个整型变量`a`、`b`和`c`,但并未赋值。然后定义了一个`EX`类型的变量`e`,并给`e.a`赋值为1,给`e.b`赋值为2。

接着,将`e.a`和`e.b`的和赋值给`e.c.x`,将`e.a`和`e.b`的积赋值给`e.c.y`。

最后,使用`cout`输出`e.c.x`和`e.c.y`的值,即输出3和2,中间用逗号隔开。

因此,程序输出结果为:3,2。

25、

#include <iostream>
#include <string>

using namespace std;

int main()
	{
		string str;
		int i;
		int count;
		count = 0;
		getline(cin, str);
		for(i = 0; i < str.length(); i++)
			if(str[i] >= 'a' && str[i] <= 'z')
				count++;
		cout << "It has " << count << " lowercases" << endl;
		return 0;

输入: NOI2016 will be held in Mian Yang.

输出:                                                 

参考答案:输出为空。

解析:【喵呜刷题小喵解析】:
程序的主要目的是统计输入字符串中小写字母的数量。然而,输入的字符串"NOI2016 will be held in Mian Yang"中并没有包含任何小写字母,因此count的值始终为0。因此,输出结果为"It has 0 lowercases",但由于程序中没有足够的输出缓冲来显示整个输出,所以可能只显示了部分输出或没有显示任何输出。正确的输出应该是"It has 0 lowercases",但由于某种原因,可能没有在屏幕上显示完整。

26、

#include <iostream>
#include <string>

using namespace std;

void fun(char *a, char *b)
	{
		a = b;
		(*a)++;
	}

int main()
	{
		char c1, c2, *p1, *p2;
		c1 = 'A';
		c2 = 'a';
		p1 = &c1;
		p2 = &c2;
		fun(p1, p2);
		cout << c1 << c2 << endl;
		return 0;
	}

输出:              

参考答案:该程序的输出结果为:`Aab`

解析:【喵呜刷题小喵解析】:
首先,该程序定义了一个函数`fun`,该函数接受两个字符指针`a`和`b`作为参数。在函数内部,`a`被重新赋值为`b`,然后`*a`(即`b`指向的字符)被加1。

在`main`函数中,定义了两个字符变量`c1`和`c2`,以及两个字符指针`p1`和`p2`。`c1`被赋值为`'A'`,`c2`被赋值为`'a'`。然后,`p1`被赋值为`c1`的地址,`p2`被赋值为`c2`的地址。

接下来,调用`fun`函数,将`p1`和`p2`作为参数传入。由于`fun`函数内部将`a`(即`p1`)重新赋值为`b`(即`p2`),因此`p1`现在指向`c2`。然后,`*a`(即`c2`)被加1,变为`'b'`。

最后,程序输出`c1`和`c2`的值。由于`p1`现在指向`c2`,所以`c1`的值仍然是`'A'`,而`c2`的值已经变为`'b'`。因此,输出结果为`Aab`。

三、实操题

27、完善程序: (打印月历)输入月份 m(1≤m≤12),按一定格式打印 2015 年第 m 月的月历。 (第三、四空 2.5 分,其余 3 分)

例如,2015 年 1 月的月历打印效果如下(第一列为周日):


#include <iostream>

#include <string>


using namespace std;


const int dayNum[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int m, offset, i;


int main()

{

cin >> m;

cout << "S\tM\tT\tW\tT\tF\tS" << endl;  //'\t'为 TAB 制表符

                         ⑴        ;

for(i = 1; i < m; i++)

offset =      ⑵      ;

for(i = 0; i < offset; i++)

cout << '\t';

for(i = 1; i <=     ⑶     ; i++)

{

cout <<    ⑷    ;

if(i == dayNum[m] ||    ⑸   == 0)

cout << endl;

else

cout << '\t';

}

return 0;

}

参考答案:1. 在空格⑴处,应填入`dayNum[m-1]`,以获取前一个月的天数。2. 在空格⑵处,应填入`dayNum[m-1] + 1`,以计算本月第一天是星期几的偏移量。3. 在空格⑶处,应填入`dayNum[m]`,以获取本月总天数。4. 在空格⑷处,应填入`i + 1`,以输出日期。5. 在空格⑸处,应填入`isLeapYear(m)`,以判断是否为闰年,并确定2月的天数。

解析:【喵呜刷题小喵解析】:

该程序的目标是根据输入的月份m,打印出2015年第m月的月历。

1. 空格⑴:为了获取前一个月的天数,我们需要使用`dayNum[m-1]`。
2. 空格⑵:为了计算本月第一天是星期几的偏移量,我们需要将前一个月的天数加1。
3. 空格⑶:为了获取本月总天数,我们需要使用`dayNum[m]`。
4. 空格⑷:为了输出日期,我们需要使用`i + 1`。
5. 空格⑸:为了判断是否为闰年,并确定2月的天数,我们需要一个函数`isLeapYear(m)`。如果m对应的年份是闰年,那么2月有29天,否则有28天。这个函数需要根据当前年份和月份来确定,但在给出的代码中并未定义,所以需要添加相应的逻辑。

注意:上述解析是基于题目描述和代码片段进行的推测,实际代码可能需要更多的上下文信息来完善。

28、完善程序:(中位数 median)给定 n(n 为奇数且小于 1000)个整数, 整数的范围在 0~m(0<m<2^31)之间, 请使 用二分法求这 n 个整数的中位数。所谓中位数,是指将这 n 个数排序之后,排在正中间的数。 (第五空 2分,其余 3 分)

#include <iostream>


using namespace std;


const int MAXN = 1000;

int n, i, lbound, rbound, mid, m, count;

int x[MAXN];


int main()

{

cin >> n >> m;

for(i = 0; i < n; i++)

cin >> x[i];

lbound = 0;

rbound = m;

while(       ⑴          )

{

mid = (lbound + rbound) / 2;

                             ⑵       ;

for(i = 0; i < n; i++)

if(     ⑶       )

                                                 ⑷       ;

if(count > n / 2)

lbound = mid + 1;

else

                                       ⑸        ;

cout << mid << " " << lbound << " " << rbound << " " << count << endl;

}

cout << rbound << endl;

return 0;

}

参考答案:1. ⑴处应填:lbound <= rbound2. ⑵处应填:count = 03. ⑶处应填:x[i] <= mid4. ⑷处应填:count++5. ⑸处应填:rbound = mid

解析:【喵呜刷题小喵解析】:

本题要求使用二分法求n个整数的中位数。首先,我们需要确定二分查找的上下界,即lbound和rbound。由于n是奇数,所以中位数就是第n/2+1小的数。我们可以将lbound设为0,rbound设为m,即整数的最大值。

然后,我们在while循环中进行二分查找。每次计算mid,即lbound和rbound的中点。然后,我们遍历数组x,统计小于等于mid的数的个数。如果个数大于n/2,说明中位数在mid的右侧,所以更新lbound为mid+1;否则,中位数在mid的左侧或就是mid,所以更新rbound为mid。

最后,当lbound > rbound时,循环结束,此时rbound就是中位数。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2015年第二十一届NOIP信奥赛普及组初赛C++试题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share