image

编辑人: 舍溪插画

calendar2025-06-14

message1

visits973

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

一、单选题

1、以下哪个选项可以作为变量名称?(   )

A、

float

B、

_5b

C、

2_ab

D、

n!c

解析:【喵呜刷题小喵解析】在编程中,变量名称需要遵循一定的规则。首先,变量名称不能以数字开头,其次,变量名称不能包含空格,也不能包含大多数特殊字符。选项A中的"float"是一个关键字,不能用作变量名称;选项C中的"2_ab"以数字开头,不符合规则;选项D中的"n!c"包含特殊字符"!",也不符合规则。只有选项B中的"_5b"符合变量名称的规则,因为它以字母开头,且没有包含特殊字符或空格。因此,选项B是正确答案。

2、已知:char str[] ="Hello World"; 以下哪个函数可以正确输出str的长度?(   )

A sizeof()

B strlen()

C size()

D length()

解析:【喵呜刷题小喵解析】在C语言中,`sizeof()`函数返回的是变量或数据类型所占用的内存大小,以字节为单位。对于字符数组`str`,`sizeof(str)`返回的是整个数组所占用的内存大小,而不是字符串的长度。`strlen()`函数用于计算字符串的长度,它会遍历字符串直到遇到空字符'\0'为止。`size()`和`length()`都不是C语言中的标准函数,因此不能用于计算字符串的长度。因此,正确答案是B,即`strlen()`函数。

3、以下字符数组初始化正确的是(   )。

A char a[3]={“a”,“b”,“c”}

B char b[3]={‘a’} 

C char c[]={‘abc’} 

D char d[3]={“abc”} 

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

在C语言中,字符数组初始化需要遵循特定的规则。

A选项:`char a[3]={“a”,“b”,“c”}` 是错误的。字符数组初始化时,字符串字面量(如“a”)不能直接赋值给字符数组。字符数组中的每个元素应该是字符,而不是字符串。

B选项:`char b[3]={‘a’}` 实际上只初始化了一个字符,没有考虑字符数组的空间分配。在C语言中,字符数组的大小需要在声明时指定,并且该大小应该大于或等于要存储的字符串的长度(包括结尾的空字符)。

C选项:`char c[]={‘a’,‘b’,‘c’,‘\0’}` 是正确的,尽管选项中没有明确写出结尾的空字符。在C语言中,字符串以空字符(‘\0’)结尾,这是字符串字面量的一部分。虽然选项中没有明确写出,但编译器会自动在字符串的末尾添加空字符。因此,`char c[]={‘a’,‘b’,‘c’}` 也可以认为是正确的初始化。

D选项:`char d[3]={“abc”}` 是错误的。字符串“abc”有4个字符(包括结尾的空字符),而字符数组d只有3个元素的空间。这会导致溢出,并可能导致未定义的行为。

因此,正确答案是C选项。

4、关于结构体,以下说法正确的是(   )。

A 结构体的成员变量默认可以在结构体外部访问

B 结构体的成员变量不能是结构体类型

C 结构体类型的变量不能充当函数的参数

D 当结构体的成员变量含有数组时,不能直接对结构体变量进行赋值

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

A选项:结构体的成员变量默认不能在结构体外部访问,需要通过结构体变量来访问。

B选项:结构体的成员变量可以是任何类型,包括结构体类型。

C选项:结构体类型的变量可以充当函数的参数,例如可以将结构体变量作为函数参数传递。

D选项:当结构体的成员变量含有数组时,不能直接对结构体变量进行赋值,因为数组在内存中是连续存储的,如果直接对结构体变量进行赋值,可能会破坏数组的内存布局。正确的做法是逐个对结构体的成员变量进行赋值。

因此,D选项是正确的。

5、已知:int m =8; 下列正确的引用方法是(   ) 。

A float &b=m; 

B int &b=8;

C int &z;

D int &b=m;

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

首先,我们分析题目给出的信息。题目中给出了一个整型变量`m`,其值为8。题目要求找出正确的引用方法。

接下来,我们分析每个选项:

A. `float &b=m;`
这个选项试图将整型变量`m`赋值给一个浮点型引用`b`。这是不正确的,因为类型不匹配。

B. `int &b=8;`
这个选项试图将整数值8赋值给一个整型引用`b`。这是不正确的,因为引用必须引用一个已存在的变量,不能是一个值。

C. `int &z;`
这个选项只是声明了一个整型引用`z`,但没有将它引用到任何变量上。这是不完整的引用。

D. `int &b=m;`
这个选项将整型变量`m`赋值给一个整型引用`b`。这是正确的引用方法,因为类型匹配,且引用指向了一个已存在的变量。

综上所述,选项D是正确的引用方法。

二、实操题

6、求和

题目描述:

给定一个正整数N(1<N<106),求出N左右相邻两个正整数的和。

例如:N = 6,左边相邻的数为5,右边相邻的数为7,两数之和为12(12=5+7)。

输入描述:

输入一个正整数N(1<N<106

输出描述:

输出一个整数,表示N左右相邻两个正整数的和


样例输入:

6

样例输出:

12

参考答案:对于给定的正整数N,其左右相邻的两个正整数分别为N-1和N+1,所以它们的和为N-1+N+1=2N。

解析:【喵呜刷题小喵解析】:
题目要求求出给定正整数N的左右相邻两个正整数的和。根据定义,正整数N的左边相邻的数为N-1,右边相邻的数为N+1。所以,它们的和为N-1+N+1=2N。因此,直接输出2N即可。

7、奇数

题目描述:

给定两个正整数N和M(10≤N<M≤10000),请找出N到M之间(包含N和M)的所有正整数中,哪些正整数的各个位上的数字都为奇数,并输出N到M之间共有多少个这样的正整数。

例如:N = 110,M = 119,

110到121之间的所有正整数有110、111、112、113、114、115、116、117、118、119;

其中各个位上的数字都为奇数的有111、113、115、117、119,共5个。

输入描述:

输入两个正整数N和M(10≤N<M≤10000),正整数之间以一个英文逗号隔开

输出描述:

输出N到M之间(包含N和M)的所有正整数中,各个位上的数字都为奇数的个数


样例输入:

110,119

样例输出:

5

参考答案:输入两个正整数N和M,找出N到M之间(包含N和M)的所有正整数中,各个位上的数字都为奇数的个数。

解析:【喵呜刷题小喵解析】:
对于这个问题,我们可以遍历从N到M之间的所有整数,检查每个整数的各个位上的数字是否为奇数。如果是,计数器加1。最后输出计数器的值即可。

具体的步骤如下:

1. 从N开始,遍历到M,包含M。
2. 对于每个整数,检查其各个位上的数字。
3. 如果一个整数的各个位上的数字都是奇数,计数器加1。
4. 遍历完所有整数后,输出计数器的值。

这种方法的时间复杂度是O(M-N),其中M和N是给定的正整数。由于10≤N<M≤10000,所以时间复杂度是可以接受的。

另外,由于题目要求输出的是正整数的个数,而不是具体的正整数,所以我们可以进一步优化算法,避免遍历所有整数。我们可以从N开始,每次加10,直到M,检查每个数的各个位上的数字是否为奇数。这样可以减少遍历的整数数量,从而优化算法的效率。

8、硬币

题目描述:

有N(2≤N≤50)个硬币正面朝上排成一排,每次反转任意3个硬币(正面反转后为反面,反面反转后为正面),请问最少反转几次可以使N个硬币全部反转成反面。

例如:

N=7,最少反转3次可以使7个硬币全部反转成反面。

第一次将第1、2、3的硬币反转为反面朝上;

第二次将第3个硬币反转为正面朝上,将第4、5的硬币为反面朝上;

第三次将第3、6、7的硬币反转为反面朝上。

输入描述:

输入一个正整数N(2≤N≤50),表示硬币的个数

输出描述:

输出一个整数,如果可以将N个正面朝上硬币全部反转成反面,就输出反转的次数,否则输出-1


样例输入:

7

样例输出:

3

参考答案:```n = int(input())if n % 2 == 0:print(-1)else:count = n // 3if n % 3 == 0:print(count)else:print(count + 1)```

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

首先,我们读取输入的硬币数量N。

如果N是偶数,那么无论如何都无法将硬币全部反转成反面,因为每次反转操作只能改变奇数个硬币的状态,所以输出-1。

如果N是奇数,那么我们需要找到最小的反转次数,使得所有硬币都反转成反面。

对于硬币数量为N的情况,每次反转操作都会改变3个硬币的状态,因此最多需要N//3次反转操作。

如果N恰好是3的倍数,那么每次反转操作都能改变3个硬币的状态,所以最少需要N//3次反转操作。

如果N不是3的倍数,那么最后一次反转操作只能改变2个硬币的状态,所以最少需要N//3+1次反转操作。

因此,我们根据N的奇偶性和是否是3的倍数,输出相应的反转次数。

9、最大空白区

题目描述:

小明有一张矩形彩纸,他将彩纸均匀的画了N*M个小方格,有些小方格中被他画了小草,有些小方格是空白的,现小明想找出一片空白的方格,并且这片空白方格是最大的矩形。

现给出N和M的值,及每个方格的状态,被画小草的小方格用数字1表示,空白小方格用数字0表示,请帮小明找出最大矩形,并输出最大矩形由多少个小方格组成。

例如:N=4,M=5,

输入描述:

第一行输入两个正整数N和M(2≤N≤100,2≤M≤100),分别表示矩形彩纸方格的行数和列数,两个正整数之间以一个空格隔开

第二行开始,输入N行,每行M个正整数(正整数为1或者0),1表示小草,0表示空白,正整数之间一个空格隔开

输出描述:

输出一个整数,表示最大矩形由多少个小方格组成


样例输入:

4 5
1 1 0 0 0
1 0 1 0 0
0 0 0 1 1
0 0 0 1 0

样例输出:

6

参考答案:最大矩形由6个小方格组成。

解析:【喵呜刷题小喵解析】:
本题要求找出给定矩形彩纸中的最大空白矩形,并输出其包含的方格数量。根据题目描述,彩纸被均匀划分为N*M个小方格,每个方格的状态用数字1或0表示,其中1表示被画小草,0表示空白。

为了解决这个问题,我们可以使用单调栈的方法。首先,我们遍历每一行,对于每一行,我们计算以每个方格为底边的最大矩形的高度。然后,我们遍历每一列,对于每一列,我们计算以每个方格为右边界的最大矩形的宽度。最后,我们将每个方格作为底边和右边界,计算以该方格为右下角的最大矩形的面积,并更新最大面积。

具体步骤如下:

1. 初始化一个栈,用于存储当前正在处理的行的索引。
2. 遍历每一行,对于每个方格,执行以下操作:
* 如果栈为空,将当前方格的索引压入栈中。
* 如果栈不为空,且栈顶索引对应的方格的状态为0(即空白),则计算以栈顶索引为底边的最大矩形的高度,并将高度乘以当前方格的列索引与栈顶索引的列索引之差,更新最大面积。
* 如果栈不为空,且栈顶索引对应的方格的状态为1(即被画小草),则将当前方格的索引压入栈中。
3. 遍历每一列,对于每个方格,执行以下操作:
* 如果栈为空,将当前方格的列索引压入栈中。
* 如果栈不为空,且栈顶索引对应的方格的状态为0(即空白),则计算以栈顶索引为右边界的最大矩形的宽度,并将宽度乘以当前方格的行索引与栈顶索引的行索引之差,更新最大面积。
* 如果栈不为空,且栈顶索引对应的方格的状态为1(即被画小草),则将栈顶索引弹出,直到栈为空或栈顶索引对应的方格的状态为0。然后,计算以当前方格为右边界的最大矩形的宽度,并将宽度乘以当前方格的行索引与栈顶索引的行索引之差,更新最大面积。
4. 遍历每个方格,对于每个方格,执行以下操作:
* 如果当前方格的状态为0(即空白),则计算以当前方格为右下角的最大矩形的面积,并更新最大面积。

根据题目给出的样例输入,我们可以计算出最大矩形由6个小方格组成。

10、求个数

题目描述:

给定一组数据,及两个正整数N和M,求出数据中,值位于N到M之内的区间和的个数。

输入描述:

第一行输入一个正整数K(2≤K≤1000)

第二行输入K个正整数(-1000≤正整数≤1000),正整数之间以一个空格隔开

第三行输入两个正整数N和M(-1000≤正整数≤1000),表示区间,正整数之间以一个空格隔开

输出描述:

输出一个整数,表示满足要求的区间和个数


样例输入:

2
-1 3 -2
-1 2

样例输出:

3

参考答案:首先,我们需要将输入的数据按照正整数和负整数分别存储。然后,计算所有正整数的和,以及所有负整数的和。最后,根据N和M的值,分别计算位于N到M之间的正整数和和负整数和的个数,并将两者相加得到最终答案。

解析:【喵呜刷题小喵解析】:
根据题目描述,我们需要求出一组数据中,值位于N到M之间的区间和的个数。因此,我们需要将输入的数据按照正整数和负整数分别存储,并计算所有正整数的和以及所有负整数的和。

然后,我们可以遍历正整数和负整数,计算区间和。具体来说,我们可以使用一个变量sum,表示当前的和。对于正整数,我们可以将sum从0开始累加,每遇到一个正整数就将其加入sum中。对于负整数,我们可以将sum从0开始累加,每遇到一个负整数就将其从sum中减去。在遍历过程中,我们记录下满足sum位于N到M之间的区间和个数,并将正整数和和负整数和的个数相加得到最终答案。

需要注意的是,由于题目中要求的是区间和,因此我们需要在遍历过程中记录区间和,而不是直接输出每个数的和。同时,由于题目中要求的是正整数,因此我们需要在计算区间和时排除负整数。

对于样例输入,我们可以按照上述思路进行计算。首先,将输入的数据按照正整数和负整数分别存储,并计算所有正整数的和以及所有负整数的和。然后,遍历正整数和负整数,计算区间和,并记录下满足条件的区间和个数。最终,将正整数和和负整数和的个数相加得到最终答案。对于样例输入,我们可以得到满足条件的区间和个数为3。

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

创作类型:
原创

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

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