Logo

2025年9月 GESP C++ 8级

GESP · 8级 · 2025-09

60:00
满分 100
时长 60 分钟
27

2025年9月 GESP C++ 8级认证考试真题(含编程操作题部分)

答题卡 已答 0/27
已答 正确 错误 编程题

单选题(共 15 题,每题 2 分)

1

小杨想点一杯奶茶外卖,但还差5元起送。于是,小杨决定点一些小料。可选的小料包括:珍珠1元、椰果2
元、奶冻3元、奶盖4元。每种小料最多点1份。请问共有多少种满足起送条件的点小料方案?( )。

2

小杨和小刘是好朋友,她们在逛商场时发现新设置的大头贴自拍机,于是决定一起拍一组照片。一组照片包
括4张,这4张照片没有顺序区分。拍每张照片时,可以选择有相框或无相框、两⼈可以分别选择有头饰或无头饰、
还可以从2种位置(小杨在左,或小刘在左)中选出一种。她们不希望一组照片中出现完全相同的相框、头饰、位置
的组合。请问一组照片共有多少种不同的方案?( )。

3

下列关于C++类的说法,错误的是( )。

4

下列关于树和图的说法,错误的是( )。

5

一对夫妻生男生⼥的概率相同。这对夫妻希望⼉⼥双全。请问这对夫妻生下三个孩⼦时,实现⼉⼥双全的概
率是多少?( )。

6

二项式 的展开式中 项的系数是( )。

7

对一个包含 个顶点、 条边的图,执行广度优先搜索,其最优时间复杂度是( )。

8

以下关于贪心法和动态规划的说法中,错误的是( )。

9

下面程序的输出为( )。

#include <iostream>
using namespace std;
int main() {
    int N = 15, cnt = 0;
    for (int x = 1; x + x + x <= N; x++)
    for (int y = x; x + y + y <= N; y++)
    for (int z = y; x + y + z <= N; z++)
    cnt++;
    cout << cnt << endl;
    return 0;
}
10

下面程序的时间复杂度为( )。

int primes[MAXP], num = 0;
bool isPrime[MAXN] = {false};
void sieve() {
    for (int n = 2; n <= MAXN; n++) {
        if (!isPrime[n])
        primes[num++] = n;
        for (int i = 0; i < num && n * primes[i] <= MAXN; i++) {
            isPrime[n * primes[i]] = true;
            if (n % primes[i] == 0)
            break;
        }
    }
}
11

下列Dijkstra算法,假设图 中顶点数 、边数 ,则程序的时间复杂度为( )。

typedef struct Edge {
    int in, out; // 从下标in顶点到下标out顶点的边
    int len; // 边长度
    struct Edge * next;
} Edge;
// v:顶点个数,graph:出边邻接表,start:起点下标,dis:输出每个顶点的最短距离
void dijkstra(int v, Edge * graph[], int start, int * dis) {
    const int MAX_DIS = 0x7fffff;
    for (int i = 0; i < v; i++)
    dis[i] = MAX_DIS;
    dis[start] = 0;
    int * visited = new int[v];
    for (int i = 0; i < v; i++)
    visited[i] = 0;
    visited[start] = 1;
    for (int t = 0; ; t++) {
        int min = MAX_DIS, minv = -1;
        for (int i = 0; i < v; i++) {
            if (visited[i] == 0 && min > dis[i]) {
                min = dis[i];
                minv = i;
            }
        }
        if (minv < 0)
        break;
        visited[minv] = 1;
        for (Edge * e = graph[minv]; e != NULL; e = e->next)
        if (dis[e->out] > e->len)
        dis[e->out] = e->len;
    }
    delete[] visited;
}
12

下面count_triple函数的时间复杂度为( )。

int gcd(int m, int n) {
    if (m == 0) return n;
    return gcd(n % m, m);
}
int count_triple(int n) {
    int cnt = 0;
    for (int v = 1; v * v * 4 <= n; v++)
    for (int u = v + 1; u * (u + v) * 2 <= n; u += 2)
    if (gcd(u, v) == 1) {
        int a = u * u - v * v;
        int b = u * v * 2;
        int c = u * u + v * v;
        cnt += n / (a + b + c);
    }
    return cnt;
}
13

下面merge_sort函数试图实现归并排序算法,横线处应该填入的是( )。

#include <vector>
using namespace std;
void merge_sort(vector<int> & arr, int left, int right) {
    if (right - left <= 1)
    return;
    int mid = (left + right) / 2;
    merge_sort(________); // 在此处填入选项
    merge_sort(________); // 在此处填入选项
    vector<int> temp(right - left);
    int i = left, j = mid, k = 0;
    while (i < mid && j < right)
    if (arr[i] <= arr[j])
    temp[k++] = arr[i++];
    else
    temp[k++] = arr[j++];
    while (i < mid)
    temp[k++] = arr[i++];
    while (j < right)
    temp[k++] = arr[j++];
    for (i = left, k = 0; i < right; ++i, ++k)
    arr[i] = temp[k];
}
14

下面Prim算法程序中,横线处应该填入的是( )。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int prim(vector<vector<int>> & graph, int n) {
    vector<int> key(n, INT_MAX);
    vector<int> parent(n, -1);
    key[0] = 0;
    for (int i = 0; i < n; i++) {
        int u = min_element(key.begin(), key.end()) - key.begin();
        if (key[u] == INT_MAX)
        break;
        for (int v = 0; v < n; v++) {
            if (__________) { // 在此处填入选项
                key[v] = graph[u][v];
                parent[v] = u;
            }
        }
    }
    int sum = 0;
    for (int i = 0; i < n; i++) {
        if (parent[i] != -1) {
            cout << "Edge: " << parent[i] << " - " << i << " Weight: " << key[i] << endl;
            sum += key[i];
        }
    }
    return sum;
}
int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> graph(n, vector<int>(n, 0));
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u][v] = w;
        graph[v][u] = w;
    }
    int result = prim(graph, n);
    cout << "Total weight of the minimum spanning tree: " << result << endl;
    return 0;
}
15

下面的程序使用出边邻接表表达的带权无向图,则从顶点0到顶点3的最短距离为( )。

#include <vector>
using namespace std;
class Edge {
    public:
    int dest;
    int weight;
    Edge(int d, int w) : dest(d), weight(w) {}
};
class Graph {
    private:
    int num_vertex;
    vector<vector<Edge>> vve;
    public:
    Graph(int v) : num_vertex(v), vve(v) {}
    void addEdge(int s, int d, int w) {
        vve[s].emplace_back(d, w);
        vve[d].emplace_back(s, w)
    }
};
int main() {
    Graph g(4);
    g.addEdge(0, 1, 8);
    g.addEdge(0, 2, 5);
    g.addEdge(1, 2, 1);
    g.addEdge(1, 3, 3);
    g.addEdge(2, 3, 7);
    return 0;
}

判断题(共 10 题,每题 2 分)

16

C++语⾔中,表达式'9' ^ 3的结果值为'999'。

17

下列C++语⾔代码,能够安全地输出arr[5]的值。

int n = 5;
int arr[n] = {1, 2, 3};
std::cout << arr[5];
18

对 个元素的数组进行排序,最差情况的时间复杂度为 。

19

有4个红球、3个蓝球和2个绿球排成一排(相同色球视为完全相同),则不同的排列方案数为1260种 。

20

使用math.h或cmath头文件中的函数,对于int类型的变量x,表达式fabs(x)和sqrt(x * x)的结
果总是近似相等的。

21

运算符重载是C++语⾔静态多态的一种典型体现,⽽使用C语⾔则无法实现运算符重载。

22

存在一个简单无向图满足:顶点数为6,边数为8,6个顶点的度数分别为3、3、3、3、2、2。

23

已知两个double类型的变量r和theta分别表⽰一个扇形的圆半径及圆心角(弧度),则扇形的周长可
以通过表达式(2 + theta) * r求得。

24

Dijkstra算法的时间复杂度为 ,其中 为图中顶点的数量。

25

从32名学生中选出2⼈分别担任男生班长和⼥生班长(男生班长必须是男生,⼥生班长必须是⼥生),则共
有 种不同的选法。

编程操作题(共 2 题,共 50 分)

26
编程操作题 25分

试题名称:最短距离

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

给定正整数 以及常数 。现在构建⼀张包含 个结点的带权⽆向图,结点依次以 编号。对于
任意满⾜ 的 ,向图中加⼊⼀条连接结点 与结点 的⽆向边,边权取决于 是否互质:
若 互质(即 的最⼤公因数为 ),则连接结点 与结点 的⽆向边长度为 ;
否则连接结点 与结点 的⽆向边长度为 。
现在给定 组询问,第 ( )组询问给定两个正整数 ,你需要回答结点 与结点 之间的最短距
离。

输入格式

第⼀⾏,三个正整数 ,分别表⽰询问数量,结点编号互质时的边权,以及结点编号不互质时的边权。
接下来 ⾏,每⾏两个正整数 ,表⽰⼀组询问。

输出格式

输出共 ⾏,每⾏⼀个整数,表⽰结点 与结点 之间的最短距离。

数据范围

对于 % 的测试点,保证 , 。
对于另外 % 的测试点,保证 。
对于所有测试点,保证 , , 。

27
编程操作题 25分

试题名称:最⼩⽣成树

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

给定⼀张包含 个结点 条边的带权连通⽆向图,结点依次以 编号,第 条边( )连接结点
与结点 ,边权为 。
对于每条边,请你求出从图中移除该条边后,图的最⼩⽣成树中所有边的边权和。特别地,若移除某条边后图的最
⼩⽣成树不存在,则输出 。

输入格式

第⼀⾏,两个正整数 ,分别表⽰图的结点数与边数。
接下来 ⾏中的第 ⾏( )包含三个正整数 ,表⽰图中连接结点 与结点 的边,边权为 。

输出格式

输出共 ⾏,第 ⾏( )包含⼀个整数,表⽰移除第 条边后,图的最⼩⽣成树中所有边的边权和。若移
除第 条边后图的最⼩⽣成树不存在,则输出 。

数据范围

子任务编号 测试点占比 特殊性质
1 % -
2 %
3 % -
4 % -
对于所有测试点,保证 , , , 。

已答 0/27