image

编辑人: 流年絮语

calendar2025-12-08

message6

visits511

第11届蓝桥杯C++青少组中/高级组国赛2020年10月真题答案及解析

一、单选题

1、在数组中,数组名表示( ).

A 数组第1个元素的首地址

B 数组第2个元素的首地址

C 数组所有元素的首地址,

D 数组最后1个元素的首地址

解析:【喵呜刷题小喵解析】:在数组中,数组名表示数组所有元素的首地址,即数组名是一个指向数组首元素的指针。因此,选项C是正确的。数组名并不是数组第1个元素的首地址、数组第2个元素的首地址或数组最后1个元素的首地址。

2、下列叙述中正确的是( ).

A 顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的

B 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构

C 顺序存储结构能存储有序表,链式存储结构不能存储有序表

D 链式存储结构比顺序存储结构节省存储空间

解析:【喵呜刷题小喵解析】
顺序存储结构是指使用一块连续的存储空间来存储数据元素,因此其存储空间一定是连续的。而链式存储结构则是通过链接一系列节点来存储数据元素,这些节点可以在内存中任意位置,因此其存储空间不一定是连续的。因此,选项A是正确的。

选项B错误,顺序存储结构不仅可以用于线性结构,也可以用于非线性结构,例如稀疏矩阵可以采用特殊的顺序存储结构。同样,链式存储结构也可以用于线性结构,例如链表。

选项C错误,无论是顺序存储结构还是链式存储结构,都可以存储有序表。顺序存储结构可以通过数组下标来访问元素,而链式存储结构可以通过指针来访问元素,只要按照某种顺序插入元素,就可以得到有序表。

选项D错误,链式存储结构和顺序存储结构各有优缺点。顺序存储结构在访问元素时速度较快,但是插入和删除元素时可能需要移动大量元素,因此可能会浪费存储空间。而链式存储结构在插入和删除元素时速度较快,但是访问元素时需要通过指针来访问,速度较慢,而且需要额外的空间来存储指针。因此,不能简单地说哪种存储结构更节省存储空间。

3、下列排序方法中,最坏情况下比较次数最少的是( ).

A 冒泡排序

B 简单的选择排序

C 直接插入排序

D 堆排序

解析:【喵呜刷题小喵解析】:
本题考查各种排序算法的最坏情况比较次数。

A. 冒泡排序:最坏情况下,需要进行n(n-1)/2次比较。

B. 简单的选择排序:最坏情况下,需要进行n(n-1)/2次比较。

C. 直接插入排序:最坏情况下,需要进行n(n-1)/2次比较。

D. 堆排序:最坏情况下,需要进行O(nlogn)次比较。

从上述分析可以看出,堆排序在最坏情况下的比较次数最少,为O(nlogn)。因此,正确答案是D。

4、下列表达式正确的是( ).

A 9++

B (x+y)++

C c+++c+++c++

D ++(a-b--)

解析:【喵呜刷题小喵解析】本题考查的是C语言中的运算符优先级和结合性。

A选项:`9++`,在C语言中,`++`是后置自增运算符,它表示先返回变量的当前值,然后再对变量进行自增。因此,`9++`这个表达式是不合法的,因为`9`不是一个变量。

B选项:`(x+y)++`,同样的,`(x+y)`表示的是一个常量(`x+y`的结果),而`++`只能作用于变量,所以这个表达式也是不合法的。

C选项:`c+++c+++c++`,在C语言中,`++`运算符不能连续使用,所以这个表达式也是不合法的。

D选项:`++(a-b--)`,`++`是前置自增运算符,表示先对变量进行自增,然后再返回变量的值。`a-b--`表示先返回`b`的当前值,然后再对`b`进行自减。因此,`++(a-b--)`这个表达式是合法的。

综上所述,只有D选项的表达式是正确的。

5、针对以下代码,判断下列说法哪个是正确的(  ).

const char str1[]="abc";

const char str2[] ="abc";

const char *p1 ="abc";

const char *p2 ="abc";

A、

str1和str2地址不同,P1和P2地址相同

B、

str1和str2地址相同,P1和P2地址相同

C、

str1和str2地址不同,P1和P2地址不同

D、

str1和str2地址相同,P1和P2地址不同

解析:【喵呜刷题小喵解析】:在C++中,`const char str1[]="abc"`和`const char str2[] ="abc"`分别定义了两个字符数组,每个数组都存储了字符串"abc"。由于它们是两个不同的数组,所以它们的地址是不同的。而`const char *p1 ="abc"`和`const char *p2 ="abc"`定义了两个指向字符串"abc"的常量指针。由于字符串字面量"abc"在内存中只存储一次,所以p1和p2都指向同一个地址。因此,正确答案是B,即str1和str2地址不同,P1和P2地址相同。

二、实操题

6、求阶乘

提示信息:

阶乘定义:一个正整数的阶乘是所有小于及等于该数的正整数的乘积。

例如:3的阶乘6(也就是1*2*3的结果)

例如:5的阶乘120(也就是12*3*4*5的结果)

题目描述:

输入一个正整数N(3<=N<=20),输出1到N之间(包含1和N)所有正整数阶乘的和。

例如:输入为3,1的阶乘为1,2的阶乘为2,3的阶乘为6,1+2+6=9,则输出9。

输入描述

输入一个正整数N(3<=N<=20)

输出描述

输出1到N之间(包含1和N)所有正整数阶乘的和


样例输入

3

样例输出

9


参考答案:输入为3时,1的阶乘为1,2的阶乘为2,3的阶乘为6,1+2+6=9,则输出9。

解析:【喵呜刷题小喵解析】:
题目要求计算从1到N的所有正整数的阶乘之和,其中N是一个输入的正整数,且3 <= N <= 20。

首先,我们需要理解阶乘的定义。阶乘是一个正整数的所有小于及等于该数的正整数的乘积。例如,3的阶乘是1*2*3=6,5的阶乘是1*2*3*4*5=120。

对于输入N,我们需要计算从1到N的所有正整数的阶乘,并将这些阶乘的值加起来。

以输入3为例,我们需要计算1的阶乘(1)、2的阶乘(2)和3的阶乘(6),然后将这三个数加起来得到9。

因此,对于输入3,输出为9。

7、判断偶数

题目描述:

输入两个不相等的四位正整数N(1000<=N<=9999)和M(1000<=M<=9999),其中N<M,中间以一个空格隔开,输出N与M之间(包含N和M)所有满足要求的正整数且正整数之间以一个英文逗号隔开。

要求每个正整数的各个位上的数都为偶数(注:0为偶数)

输入描述

在一行输入两个不相等的四位正整数N和M(N和M之间以一个空格隔开)

输出描述

输出N与M之间(包含N和M)所有满足要求的正整数且正数之间以一个英文逗号隔开


样例输入

4000 4008

样例输出

4000,4002,4004,4006,4008

参考答案:根据题目要求,我们需要找出N和M之间(包含N和M)所有满足条件的正整数,即每个正整数的各个位上的数都为偶数。首先,我们需要确定N和M的值,然后遍历N到M之间的所有整数,检查每个整数的各个位上的数是否为偶数。如果是,则将该整数添加到结果列表中。最后,将结果列表中的整数以英文逗号隔开输出即可。

解析:【喵呜刷题小喵解析】:
本题是一道算法题,主要考察对数字的处理和遍历算法的应用。

首先,我们需要读取输入的N和M的值,并确定它们的范围。然后,我们可以使用循环遍历N到M之间的所有整数,对于每个整数,我们可以将其转换为字符串,然后遍历每个字符(即每个位上的数字),检查它们是否为偶数。如果是,则将该整数添加到结果列表中。

最后,我们需要将结果列表中的整数以英文逗号隔开输出。这可以通过将结果列表转换为字符串,并在每个整数之间添加英文逗号来实现。

需要注意的是,由于题目要求输出的整数之间需要以英文逗号隔开,因此我们需要将结果列表中的每个整数转换为字符串,并在它们之间添加英文逗号。另外,由于题目要求输出的整数必须为四位正整数,因此我们需要在输出结果之前对结果列表中的每个整数进行检查,确保它们都在规定的范围内。

8、计数

题目描述

输入一个正整数n(1 <=n<= 1000),统计从1到n之间(包含1和n)所有正整数中,0,1,2,3,4,5,6,7,8,9的数字分别出现的次数,且按样例分行输出(按0到9顺序输出,英文逗号前为0到9的数字,逗号后为该数字出现的次数)。

例如:n为12,那么1到n之间所有的正整数有1,2,3,4,5,6,7,8,9,10,11,12.

在12个正整数中数字0出现了1次数字1出现了5次数字2出现了2次数字2,3,4,5,6,7,8,9分别出现了1次。

输入描述

输入一个正整数n

输出描述

0,0出现的次数

1,1出现的次数

2,2出现的次数

………

9,9出现的次数


样例输入

10

样例输出

0,1
1,2
2,1
3,1
4,1
5,1
6,1
7,1
8,1
9,1

参考答案:```bashn=int(input())count = [0] * 10for i in range(1, n+1):for j in str(i):count[int(j)] += 1for i in range(10):print(str(i) + ',' + str(count[i]))```

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

本题要求统计从1到n之间(包含1和n)所有正整数中,0,1,2,3,4,5,6,7,8,9的数字分别出现的次数,且按样例分行输出(按0到9顺序输出,英文逗号前为0到9的数字,逗号后为该数字出现的次数)。

首先,我们需要读取输入的n值,然后创建一个长度为10的列表count,用于记录每个数字出现的次数。

接着,我们遍历从1到n的所有整数,将每个整数的每个数字提取出来,并对应地增加count列表中对应位置的计数。

最后,我们遍历count列表,按照题目要求的格式输出每个数字及其出现的次数。

具体实现时,我们使用Python语言,通过input()函数读取输入的n值,使用for循环遍历从1到n的所有整数,使用str()函数将每个整数转换为字符串,使用for循环遍历字符串中的每个字符,使用int()函数将字符转换为数字,并对应地增加count列表中对应位置的计数。最后,使用for循环遍历count列表,使用print()函数输出每个数字及其出现的次数。

9、找公共子串

题目描述:

分行输入两个字符串(2<=字符串长度<=100),找出两个字符串中最大的公共子串,然后将公共子串及公共子串的长度分行输出

例如:输入两个宇串为abcdab和baabcd,其最大的公共子串为"abcd",子串长度为4.

输入描述

第一行输入一个字符串

第二行输入一个字符串

输出描述

第一行输出最大公共子串

第二行输出最大公共子串长度


样例输入

abcdab
baabcd

样例输出

abcd
4

参考答案:br />输入:abcdabbaabcd输出:abcd4

解析:【喵呜刷题小喵解析】
这个题目要求找出两个字符串中最大的公共子串,并将公共子串及其长度输出。

首先,我们需要理解什么是公共子串。公共子串是指两个字符串中都存在的子串。

对于这个问题,我们可以使用动态规划的方法来解决。我们可以创建一个二维数组dp,其中dp[i][j]表示第一个字符串的前i个字符和第二个字符串的前j个字符的最大公共子串长度。如果s1的第i个字符和s2的第j个字符相等,那么dp[i][j] = dp[i-1][j-1] + 1;否则,dp[i][j] = 0。

接着,我们需要找到最大公共子串。我们可以从dp数组的右下角开始,如果dp[i][j] > 0,那么s1的第i个字符和s2的第j个字符就是最大公共子串的一部分。我们可以继续向前查找,直到找到一个位置(i', j'),使得dp[i'][j'] = 0,那么s1的第i'+1个字符到第i个字符和s2的第j'+1个字符到第j个字符就是最大公共子串。

在这个例子中,第一个字符串是"abcdab",第二个字符串是"baabcd"。根据动态规划的方法,我们可以计算出dp数组:


```
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 1 0
0 0 0 0 1 0
```
从dp数组的右下角开始,我们可以找到最大公共子串"abcd",其长度为4。

10、最少问题

题目描述:

输入两个整数n(0<n<100001)和k(0<k<100001),通过对n连续进行加1或减1或乘以2这3种操作,使得n最后结果正好等于k(同一种操作可以使用多次也可以不使用),要求最后输出最少的操作次数。

例如:n为5,k为17,通过减1、乘以2、乘以2、加1四次操作得到17,也就是5-1=4,4*2=8、8*2=16,16+1=17.

输入描述

输入两个整数n和k(n和k之间以一个空格隔开)

输出描述

输出最少的操作次数


样例输入

5 17

样例输出

4

参考答案:输入的两个整数为n和k,n=5,k=17。最少操作次数为4次。

解析:【喵呜刷题小喵解析】:
这个问题可以使用广度优先搜索(BFS)算法来解决。我们首先将n加入队列中,然后开始循环执行以下操作:

1. 从队列中取出一个数num,检查它是否等于k。如果等于k,则返回操作次数。
2. 如果num不等于k,则进行以下三种操作:
* 将num加1,将结果加入队列中,并将操作次数加1。
* 将num减1,将结果加入队列中,并将操作次数加1。
* 将num乘以2,将结果加入队列中,并将操作次数加1。
3. 重复步骤1和2,直到队列为空。

对于输入的n=5和k=17,我们可以按照以下步骤执行操作:

1. 5 -> 6 (加1)
2. 6 -> 12 (乘以2)
3. 12 -> 11 (减1)
4. 11 -> 22 (乘以2)
5. 22 -> 23 (加1)

因此,最少操作次数为4次。

11、回形取数

提示信息:

回形取数是沿着一个数字矩阵的左上角向下开始移动取数当前方没有数字或者数字已经被取过就会左转继续移动取数当没有数可取时回形取数结束,如下图所示

回形取数结束后会产生一条线路图,也就是数字线路。

上路为:1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7

题目描述:

用户分行输入两个正整数(2<=正整数<=20),第一个数代表数字矩阵的行数,第二个数代表数字矩阵的列数,数字矩阵的数字为从1开始的正整数,根据回形取数规则将最终的数字线路输出(数字线路中的每个数字之间需要有一个英文逗号隔开)。

例如:

输入的是2和3数字矩阵为:

1 2 3

4 5 6

数字线路为:1,4,5,6,3,2

输入的是4和3数字矩阵为:

1 2 3

4 5 6

7 8 9

10 11 12

数字线路为:1,4,7,10,11,12,9,6,3,2,5,8

注:数字矩阵不需要输入此处只为展示

输入描述

第一行输入一个正整数作为行数

第二行输入一个正整数作为列数

编出描述

根据回形取数规则将数字线路输出(数字线路中的每数字之间需要有一个英文逗号隔开)


样例输入

3
2

样例输出

1,3,5,6,4,2

参考答案:首先,输入两个正整数作为行数n和列数m,然后根据回形取数规则进行取数,并输出数字线路。

解析:【喵呜刷题小喵解析】:
对于本题,用户输入两个正整数n和m,分别代表数字矩阵的行数和列数。数字矩阵的数字为从1开始的正整数。根据回形取数规则,从左上角开始,向下取数,当前方没有数字或者数字已经被取过,就左转继续移动取数,直到没有数可取时结束。

根据回形取数规则,我们可以模拟这个过程,生成数字线路。具体来说,我们可以按照以下步骤实现:

1. 创建一个n*m的二维数组,将数字从1开始填充到数组中。
2. 初始化四个方向向量,分别代表上、下、左、右四个方向。
3. 初始化当前位置为(0,0),也就是矩阵的左上角。
4. 初始化一个空列表,用于存储数字线路。
5. 进入循环,直到当前位置超出矩阵范围或者当前位置已经被取过:
* 将当前位置的数字添加到数字线路列表中。
* 如果当前位置是矩阵的最后一行且当前位置右边还有数字,或者当前位置不是矩阵的最后一行且当前位置右边没有数字但是下方还有数字,则将方向向量转向右。
* 如果当前位置是矩阵的最后一列且当前位置上方还有数字,或者当前位置不是矩阵的最后一列且当前位置上方没有数字但是左侧还有数字,则将方向向量转向上。
* 如果当前位置不是矩阵的最后一行且当前位置下方还有数字,则将方向向量转向下。
* 如果当前位置不是矩阵的第一列且当前位置左侧还有数字,则将方向向量转向左。
* 根据当前的方向向量,更新当前位置。
6. 将数字线路列表中的数字用英文逗号隔开,输出即可。

以上就是本题的解析和答案。

12、带分数

提示信息:

带分数是分数的一种形式,带分数包含两个部分:整数部分和真分数部分.

例如:前边的3为整数部分,后边4分之3为真分数部分。读作:三又四分之三.

例如:

5用带分数形式可表示为:3+2956/1478,3+2956/1478,3+9562/4781,3+9712/4856

要求:带分数中,数字1-9分别出现且只出现一次。

5的带分数形式有4种表示法.

输出这个正整数满足要求的带分数表示方法,一共有多少种


样例输入

100

样例输出

11

参考答案:由于题目要求带分数中,数字1-9分别出现且只出现一次,因此我们需要找出满足这个条件的所有带分数表示方法。由于题目没有给出具体的正整数,因此我们需要遍历所有可能的正整数,并检查它们是否满足条件。

解析:【喵呜刷题小喵解析】:
本题是一道关于带分数的题目,要求找出满足特定条件的带分数表示方法。由于题目没有给出具体的正整数,因此我们需要遍历所有可能的正整数,并检查它们是否满足条件。

首先,我们需要了解带分数的定义。带分数是分数的一种形式,包含两个部分:整数部分和真分数部分。例如,3又4分之3可以写作3+3/4,其中3是整数部分,3/4是真分数部分。

根据题目要求,我们需要找出满足以下条件的带分数表示方法:数字1-9分别出现且只出现一次。由于数字不能重复,我们需要遍历所有可能的数字组合,并检查它们是否满足条件。

对于每个正整数,我们可以尝试将其分解为整数部分和真分数部分。具体来说,我们可以从1到9中选择一个数字作为整数部分,然后从剩下的8个数字中选择一个作为分子,再从1到8中选择一个分母。这样,我们就可以得到一个带分数表示方法。

由于我们需要遍历所有可能的正整数,并检查它们是否满足条件,因此这是一个遍历和检查的过程。由于题目没有给出具体的正整数,因此我们需要编写一个程序来自动完成这个过程。

最终,我们可以统计满足条件的带分数表示方法的数量,并输出结果。

需要注意的是,由于题目要求数字1-9分别出现且只出现一次,因此我们需要确保在遍历和检查的过程中,数字的使用是唯一的。否则,我们可能会得到重复或不满足条件的带分数表示方法。

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

创作类型:
原创

本文链接:第11届蓝桥杯C++青少组中/高级组国赛2020年10月真题答案及解析

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