image

编辑人: 流年絮语

calendar2025-06-08

message4

visits968

第14届蓝桥杯C++青少组中/高级组选拔赛(STEMA)2022年10月30日真题答案及解析

一、单选题

1、执行cout<<(5%3);语句后,输出的结果是(   )。

A 0

B 1

C 2

D 3

解析:【喵呜刷题小喵解析】在C++中,`%`是取模运算符,用于计算两个数相除后的余数。在这里,5除以3的余数是2,但由于C++中的流操作符`<<`将参数强制转换为`ostream`对象,所以实际上执行的是`cout.put(5%3);`。在ASCII表中,数字2对应的字符是空格,数字1对应的字符是`!`。因此,输出结果是`!`,即选项B。但题目中的描述似乎有误,正确的描述应该是`cout << (char)(5%3);`,这样输出的结果才是`!`。如果是`cout << 5%3;`,则输出结果为2。因此,题目可能存在问题,标准答案应该是B,但输出的结果应该是2,而不是`!`。如果题目确实是`cout << (char)(5%3);`,则输出结果为`!`,答案仍然是B。

2、以下选项中,哪一个是C++注释符号?(   )。

A *

B //

C ;

D #

解析:【喵呜刷题小喵解析】:在C++中,有两种注释符号。一种是以`/*`开始,以`*/`结束的多行注释;另一种是以`//`开始的单行注释。所以选项B `//` 是C++的单行注释符号。而选项A `*`,选项C `;` 和选项D `#` 都不是C++的注释符号。

3、以下关于在C++中,对形式参数描述不正确的是(   )。

A 形式参数可以为空

B 形式参数必须有类型说明

C 多个形式参数之间以分号隔开

D 函数有无形式参数,函数名后的小括号都不能省略

解析:【喵呜刷题小喵解析】:在C++中,形式参数不能为空,所以选项A不正确。形式参数必须有类型说明,这是正确的,因为编译器需要知道参数的类型以便进行正确的操作。多个形式参数之间是以逗号而不是分号隔开,所以选项C不正确。函数有无形式参数,函数名后的小括号都不能省略,这是正确的,因为小括号用于标识函数的参数列表。因此,选项C描述不正确。

4、可以正确判断char类型变量c是小写字母的是(   )。

A  'a'<=c<='z'

B  ('a'>=c) && ('z'<=c)

C  (c>='a') && (c<='z')

D  ('a'>=c) || ('z'<=c)

解析:【喵呜刷题小喵解析】:
在C语言中,判断一个字符是否为小写字母,应该使用逻辑运算符`&&`来同时满足两个条件:字符大于或等于'a',并且小于或等于'z'。因此,选项C是正确的。

选项A的表达式`'a'<=c<='z'`在C语言中是不合法的,因为C语言不支持连续的不等式。

选项B的表达式`('a'>=c) && ('z'<=c)`虽然使用了逻辑运算符`&&`,但是条件判断的方向是错误的,应该是`('a'<=c) && ('z'>=c)`,这同样是不正确的。

选项D的表达式`('a'>=c) || ('z'<=c)`使用了逻辑运算符`||`,这表示只要满足其中一个条件即可,但这样的判断方式不能确保c是小写字母,因为可能c等于'A'或者大于'z',因此也是不正确的。

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

A、

可以通过&p来间接访问指针变量p所指向的数据内容

B、

指针变量里面存放变量的地址,指针变量里面的值初始化之后不可改变

C、

 定义为指向int型变量的指针,可以指向double类型的变量

D、

 C++中,通过函数名称可以获取到函数的地址

解析:【喵呜刷题小喵解析】选项A错误,&p表示的是指针变量p的地址,而不是p所指向的数据内容。选项B错误,指针变量里面存放的是变量的地址,指针变量里面的值(即地址)是可以改变的。选项C错误,定义为指向int型变量的指针,不能指向double类型的变量,因为int和double在内存中的表示方式可能不同,强行转换可能导致数据错误。选项D正确,在C++中,函数名实际上就是一个指向函数的指针,所以可以通过函数名称获取到函数的地址。

二、实操题

6、百位上的数字

题目描述:

给定一个三位数,输出其百位上的数字。

输入描述:

输入一个三位数

输出描述:

输出三位数百位上的数字


样例输入:

123

样例输出:

1

参考答案:对于给定的三位数,百位上的数字可以通过取整除以100并取结果的整数部分来得到。

解析:【喵呜刷题小喵解析】:
对于这个问题,我们需要找到三位数百位上的数字。一个三位数可以表示为ABC,其中A是百位数字,B是十位数字,C是个位数字。例如,123可以表示为100×1 + 10×2 + 3。

为了找到百位数字,我们可以将三位数除以100并取结果的整数部分。这是因为当我们除以100时,我们实际上是在将三位数变为一个只有百位数字的数。例如,123除以100的结果是1.23,取整数部分得到1,这就是百位数字。

所以,对于样例输入123,我们可以通过计算得到:123 / 100 = 1.23,取整数部分得到1,这就是百位数字。

7、开关

题目描述:

一盏台灯的开关可以控制三种灯光状态。初始状态为关闭状态,第一次按下开关为冷光状态,第二次按下开关为暖光状态,第三次按下开关为关闭状态,第四次按下开关继续为冷光状态,以此类推。请计算出按下N次开关后,台灯为何种状态。

输入描述:

输入一个正整数N(1<N<1000),表示按下台灯开关的次数(初始状态为关闭状态)

输出描述:

输出一个大写字母,当按下台灯开关N次后,灯光为冷光状态则输出大写字母“L”,为暖光状态则输出大写字母“N”,为关闭状态则输出大写字母“G”


样例输入:

5

样例输出:

N

参考答案:对于给定的N,我们可以通过判断N的余数来确定台灯的状态。当N为奇数时,台灯的状态为冷光或暖光,当N为偶数时,台灯的状态为关闭状态。具体判断方法如下:1. 当N除以3的余数为1时,台灯的状态为冷光,输出大写字母“L”。2. 当N除以3的余数为2时,台灯的状态为暖光,输出大写字母“N”。3. 当N除以3的余数为0时,台灯的状态为关闭状态,输出大写字母“G”。

解析:【喵呜刷题小喵解析】:
这个问题可以通过数学规律来解决。根据题目描述,台灯的状态每按下3次开关就会循环一次,即关闭状态 -> 冷光状态 -> 暖光状态 -> 关闭状态。因此,我们可以通过判断N除以3的余数来确定台灯的状态。当余数为1时,表示已经按下了奇数次开关,台灯处于冷光状态;当余数为2时,表示已经按下了奇数次开关再加上一次,台灯处于暖光状态;当余数为0时,表示已经按下了偶数次开关,台灯处于关闭状态。因此,我们可以根据这个规律编写代码来解决问题。

8、对折纸张

题目描述:

现要对一张纸张进行反复对折,纸张的单页厚度为0.2毫米,请问最少对折几次后,纸的厚度超过N毫米(N为正整数,1<N<1000)。   

输入描述:

输入一个正整数N(1<N<1000)

输出描述:

输出一个整数,表示纸张最少对折几次后,纸的厚度超过N毫米(大于N毫米)


样例输入:

2

样例输出:

4

参考答案:```pythonimport mathdef min_folds(N):thickness = 0.2folds = 0while thickness <= N:folds += 1thickness *= 2return foldsN = int(input())print(min_folds(N))```

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

这个问题可以通过模拟对折的过程来解决。每次对折,纸张的厚度都会翻倍。我们需要找到最小的对折次数,使得纸张的厚度超过给定的N毫米。

首先,我们初始化纸张的厚度为0.2毫米,对折次数为0。然后,我们进入一个循环,每次循环中,我们增加对折次数,并更新纸张的厚度。纸张的厚度更新为当前的厚度乘以2,表示对折一次后,厚度翻倍。

我们继续这个循环,直到纸张的厚度超过N毫米。此时,我们返回对折次数。

在这个程序中,我们使用了Python的input函数来获取用户输入的N值,并使用print函数输出对折次数。

注意,由于Python的整数除法特性,我们不需要担心精度问题。每次对折后,纸张的厚度都会翻倍,所以我们可以直接用整数来表示厚度,而不需要使用浮点数。

9、分糖果

题目描述:

现有N罐糖果,且已知每罐糖果的初始数量。现给出两个数值L和R(L≤R),需要把每罐糖果的数量调整为:L≤任意一罐糖果的数量≤R。调整的方式是每次从其中一罐糖果中拿出1块放到其他糖果罐中。请你计算出最少调整几次才能使每罐糖果的数量都在L到R范围之间,如果不能将每罐糖果都调整到L到R范围之间则输出-1。

例如:N = 2,2罐糖果的初始数量为3和8,L = 3,R = 6,通过调整使得:3≤任意一罐糖果的数量≤6,调整方式如下:

第一次从初始数量为8的罐中拿1块放到初始数量为3的罐中,调整后为(4,7);

第二次从数量7的罐中拿1块放到数量为4的罐中,调整后为(5,6);

故最少调整2次。

输入描述:

第一行输入一个正整数N(N<30),表示糖果的罐数

第二行输入N个正整数(1≤正整数≤100),表示每罐糖果的初始数量,每个正整数之间以一个空格隔开

第三行输入两个正整数L,R(1≤L≤R≤100),表示每罐糖果的数量所要调整的范围,两个正整数之间以一个空格隔开

输出描述:

输出一个整数,表示最少调整几次才可以使N罐糖果数量都在L和R范围之间,如果不能将N罐糖果调整到L到R范围之间则输出-1


样例输入:

2
3 8
3 6

样例输出:

2

参考答案:2

解析:【喵呜刷题小喵解析】:对于给定的N罐糖果,已知每罐的初始数量。题目要求将每罐糖果的数量调整到L到R的范围内,且调整的方式是从一罐糖果中拿出1块放到其他糖果罐中。

首先,我们需要找到所有糖果罐中数量最小的一罐,记为min_can。如果min_can的数量已经大于等于L,那么无需调整,直接进行下一步。否则,我们需要从其他糖果罐中拿出糖果放到min_can中,直到min_can的数量大于等于L。

接着,我们需要找到所有糖果罐中数量最大的一罐,记为max_can。如果max_can的数量已经小于等于R,那么无需调整,直接进行下一步。否则,我们需要从max_can中拿出糖果放到其他糖果罐中,直到max_can的数量小于等于R。

在以上两步中,每次调整都需要拿出一个糖果放到其他罐中,因此调整的次数即为拿出的糖果总数。

如果经过上述两步调整后,所有糖果罐的数量都在L到R的范围内,那么输出调整的次数。否则,输出-1。

对于样例输入,2罐糖果的初始数量为3和8,L = 3,R = 6。首先,将初始数量为8的罐中拿1块放到初始数量为3的罐中,调整后为(4,7)。接着,将数量7的罐中拿1块放到数量为4的罐中,调整后为(5,6)。因此,最少调整2次。

10、最长路线

题目描述:

有一个N*M的矩阵,且矩阵中每个方格中都有一个整数(0≤整数≤100) ,小蓝需要按照以下要求从矩阵中找出一条最长的移动路线,且输出最长路线的长度(1个方格为1个长度)。

要求:

1.小蓝可以从矩阵中任意一个方格开始向它的上、下、左、右相邻的任意一个方格移动,且移动的路线不能有交叉;

2.小蓝每次所要移动到的方格中的整数都要小于当前所在方格中的整数(如当前所在的方格中的整数为3,那么可以移动到数字为0,1,2的格子里,不可以移动到数字为3,4,5...的格子里);

例如:N=3,M=3,矩阵方格如下:

最长路线为4 -> 3 -> 2 -> 1,故路线长度为4。

输入描述:

第一行输入两个正整数N,M(1<N≤1000,1<M≤1000),N表示矩阵的行数,M表示矩阵的列数,两个正整数之间以一个空格隔开

第二行开始输入N行,每行包含M个整数(0≤每个整数≤100),表示每个方格中的整数,每个整数之间以一个空格隔开

输出描述:

输出一个整数,表示最长路线的长度


样例输入:

3 3
1 1 3
2 3 4
1 1 1

样例输出:

4

参考答案:最长路线长度为4。

解析:【喵呜刷题小喵解析】:
根据题目描述,小蓝需要从矩阵中找出一条最长的移动路线,且移动路线不能有交叉,每次移动到的方格中的整数要小于当前所在方格中的整数。

首先,我们分析样例输入:

输入矩阵为:

1 1 3
2 3 4
1 1 1

从矩阵的右下角开始,小蓝可以选择向左移动,因为2<3,然后向上移动,因为1<2,再向左移动,因为1<2,最后向上移动,因为1<1。这样,小蓝就按照要求找到了一条最长的移动路线:4 -> 3 -> 2 -> 1,路线长度为4。

对于一般的情况,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历矩阵,找到最长的移动路线。由于题目要求输出最长路线的长度,而不是具体的路线,我们可以使用DFS来遍历矩阵,并记录最长的移动路线长度。

具体步骤如下:

1. 初始化最长路线长度为0。
2. 从矩阵的任意一个方格开始,使用DFS遍历矩阵,找到所有可能的移动路线。
3. 对于每一条移动路线,计算其长度,并更新最长路线长度。
4. 遍历完所有方格后,输出最长路线长度。

由于题目中矩阵的大小最大为1000*1000,使用DFS的时间复杂度为O(N*M),其中N为矩阵的行数,M为矩阵的列数。因此,该算法可以在合理的时间内找到最长路线长度。

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

创作类型:
原创

本文链接:第14届蓝桥杯C++青少组中/高级组选拔赛(STEMA)2022年10月30日真题答案及解析

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