#BW107. 全国信息素养大赛初中组C++算法应用主题赛初赛模拟试卷03

全国信息素养大赛初中组C++算法应用主题赛初赛模拟试卷03

一、单项选择题(每题 5 分,共 50 分)

第 1 题

"丝路算术"游戏中,商队计算混合类型表达式。执行以下代码,输出结果是( )。

int a = 5, b = 2;
double c = a / b + 1.5;
cout << c;

{{ select(1) }}

  • 2.5
  • 3
  • 3.5
  • 4

第 2 题

"丝路历法"程序中,需要判断年份是否为闰年。阅读以下代码,若 year = 2000,输出结果是( )。

int year = 2000;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    cout << "闰年" << endl;
else
    cout << "平年" << endl;

{{ select(2) }}

  • 闰年
  • 平年
  • 编译错误
  • 无法确定

第 3 题

"丝路驿站"商队清点货物。执行以下代码,输出结果是( )。

struct Goods {
    string name;
    int price;
};
Goods g = {"丝绸", 50};
g.price = g.price + 20;
cout << g.name << ":" << g.price;

{{ select(3) }}

  • 丝绸:20
  • 丝绸:50
  • 丝绸:70
  • 编译错误

第 4 题

"非遗制陶"工艺流程模拟:每烧制一件陶器消耗 3 斤陶土,每烧完 4 件陶器后可回收 5 斤废土再利用。工坊初始有 20 斤陶土。以下代码模拟最多能烧制多少件陶器,输出结果是( )。

int clay = 20, cnt = 0;
while (clay >= 3) {
    clay -= 3;
    cnt++;
    if (cnt % 4 == 0) clay += 5;
}
cout << cnt;

{{ select(4) }}

  • 8
  • 9
  • 10
  • 11

第 5 题

"红色密码"解密中,需对整数进行逐位处理:跳过数字 0,将剩余数位反转重组。执行以下代码,输出结果是( )。

int n = 3081, s = 0;
while (n > 0) {
    int d = n % 10;
    if (d != 0) s = s * 10 + d;
    n /= 10;
}
cout << s;

{{ select(5) }}

  • 1803
  • 183
  • 3081
  • 18

第 6 题

"茶马古道"地形图中,使用 3 行 4 列的二维数组记录海拔。执行以下代码,输出结果是( )。

int a[3][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {0, 9, 8, 7}};
int sum = 0;
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        if ((i + j) % 2 == 0) sum += a[i][j];
    }
}
cout << sum;

{{ select(6) }}

  • 22
  • 24
  • 26
  • 30

第 7 题

"锦绣中华"图案展示中,执行以下代码,输出的图案是( )。

for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 5 - i; j++) cout << " ";
    for (int j = 1; j <= 2 * i - 1; j++) cout << "*";
    cout << endl;
}

{{ select(7) }}

  • 一个左对齐的直角三角形
  • 一个右对齐的直角三角形
  • 一个居中的等腰三角形(金字塔形)
  • 一个 5 行 5 列的正方形

第 8 题

"汉诺塔"传说中,僧侣每移动一次金盘需诵经 1 分钟。以下递归函数计算移动 N 层塔所需诵经时间(分钟):

int chant(int n) {
    if (n == 1) return 1;
    return 2 * chant(n - 1) + 1;
}

执行 cout << chant(5); 的输出是( )。

{{ select(8) }}

  • 15
  • 16
  • 31
  • 63

第 9 题

"丝路古籍"数字化项目中,使用二分查找在已排序的编号中快速定位典籍。数组 a[10] = {5, 12, 18, 25, 33, 47, 56, 69, 78, 90} 存储了 10 本典籍的编号(升序)。以下代码查找编号 56steps 记录查找过程中 while 循环体的执行次数,最终输出结果是( )。

int a[10] = {5, 12, 18, 25, 33, 47, 56, 69, 78, 90};
int target = 56;
int L = 0, R = 9, steps = 0;
while (L <= R) {
    steps++;
    int mid = (L + R) / 2;
    if (a[mid] == target) break;
    else if (a[mid] > target) R = mid - 1;
    else L = mid + 1;
}
cout << steps;

{{ select(9) }}

  • 2
  • 3
  • 4
  • 5

第 10 题

"丝路商队"银两找零中,用面值为 10 两、5 两、1 两的银锭凑 37 两,贪心策略为每次优先选最大可用面值,使银锭总数最少。以下代码模拟这一贪心过程,输出最少银锭数是( )。

int n = 37, cnt = 0;
int coins[3] = {10, 5, 1};
for (int i = 0; i < 3; i++) {
    cnt += n / coins[i];
    n %= coins[i];
}
cout << cnt;

{{ select(10) }}

  • 5
  • 6
  • 7
  • 8

二、多项选择题(每题 5 分,共 25 分)

第 11 题

以下关于 C++ 基本概念的说法,正确的有( )。

A. const double PI = 3.14159; 定义了一个常量,其值在程序中不可修改
B. 表达式 sizeof(int) 用于获取 int 类型在内存中所占的字节数
C. C++ 中 // 表示单行注释,/* */ 表示多行注释
D. int x = 3.9 + 0.1; 执行后 x 的值为 4

{{ input(11) }}

第 12 题

执行以下代码,关于输出结果的描述,正确的有( )。

for (int i = 1; i <= 30; i++) {
    if (i % 7 == 0) cout << i << " ";
}

A. 输出中包含数字 7
B. 输出中包含数字 14
C. 输出中包含数字 21
D. 输出中包含数字 35

{{ input(12) }}

第 13 题

"红色根据地"行军路线规划中涉及多种数据结构与算法。以下说法正确的有( )。

A. 栈(Stack)是一种后进先出(LIFO)的数据结构,入栈和出栈操作都在栈顶进行
B. 队列(Queue)是一种先进先出(FIFO)的数据结构,广度优先搜索(BFS)常使用队列逐层扩展节点
C. 对长度为 N 的已排序数组进行二分查找,每次比较可将搜索范围缩小一半,时间复杂度为 O(log N)
D. 单向链表支持通过下标(如 list[3])在 O(1) 时间内随机访问任意元素

{{ input(13) }}

第 14 题

"丝路贸易"数据处理中涉及多种算法。以下关于算法的说法,正确的有( )。

A. 冒泡排序每趟将当前未排序部分的最大(或最小)元素移动到正确位置
B. 深度优先搜索(DFS)通常使用栈(stack)或递归来实现
C. 归并排序(Merge Sort)采用"分而治之"思想,时间复杂度为 O(N log N)
D. 贪心算法的核心是每一步选择当前最优,且对所有问题都能得到全局最优解

{{ input(14) }}

第 15 题

关于 C++ 函数与递归,以下说法正确的有( )。

A. 递归函数必须至少有一个终止条件(基线条件),否则会造成无限递归导致栈溢出
B. C++ 中函数的参数传递默认采用"值传递"方式,即形参是实参的副本
C. 函数内部可以调用其他函数(嵌套调用),但不能在函数内部定义另一个函数(嵌套定义)
D. 递归实现的程序总是比等价的迭代(循环)实现运行得更快

{{ input(15) }}


三、判断题(每题 5 分,共 25 分)

第 16 题

在 C++ 中,表达式 5 > 3 && 2 < 1 的结果为 false(或 0)。( )

{{ select(16) }}

  • 正确
  • 错误

第 17 题

归并排序(Merge Sort)是一种基于"分而治之"思想的排序算法,其在任何情况下的时间复杂度都是 O(N log N),但需要 O(N) 的额外辅助空间来完成合并操作。( )

{{ select(17) }}

  • 正确
  • 错误

第 18 题

对数组 int a[5] = {5, 3, 1, 4, 2} 执行冒泡排序(升序,每趟将当前未排序部分的最大元素交换到末尾),第一趟排序结束后数组的最后一个元素一定是 5。( )

{{ select(18) }}

  • 正确
  • 错误

第 19 题

在算法设计中,贪心算法的核心思想是每一步都选择当前看起来最优的选项。对于任何问题,贪心算法都一定能得到全局最优解。( )

{{ select(19) }}

  • 正确
  • 错误

第 20 题

"红色密码"数据分析中,执行以下代码,输出结果表示数组元素的最大值。( )

int a[6] = {3, 1, 4, 1, 5, 9};
int ans = a[0];
for (int i = 1; i < 6; i++) {
    if (a[i] < ans) ans = a[i];
}
cout << ans;

{{ select(20) }}

  • 正确
  • 错误