理论卷2023年12月GESP等级认证(C++) · 五级

GESP C++ 5级 2023.12

满分 100 · 及格 60 · 时长 60 分钟 · 共 27 题 (单选15 / 判断10 / 编程题2)
试卷阅览 · 免费预览前 10 题 · 交卷后可查看答案与解析
1
单选题号 #13003
分值 2

下面 C++ 代码用于求斐波那契数列,该数列第 11、22 项为 11,以后各项均是前两项之和。下面有关说法错误的是

int fiboA(int N) {
 if (N == 1 || N == 2) {
 return 1;
 }
 return fiboA(N - 1) + fiboA(N - 2);
}

int fiboB(int N) {
 if(N == 1 || N == 2) {
 return 1;
 }
 int last2 = 1, last1 = 1;
 int nowVal = 0;
 for(int i = 2; i < N; i++) {
 nowVal = last1 + last2;
 last2 = last1;
 last1 = nowVal;
 }
 return nowVal;
}
A

fiboA( ) 用递归方式, fiboB() 循环方式

B

fiboA( ) 更加符合斐波那契数列的数学定义,直观易于理解,而 fiboB() 需要将数学定义转换为计算机程序实现

C

fiboA( ) 不仅仅更加符合数学定义,直观易于理解,且因代码量较少执行效率更高

D

fiboB( ) 虽然代码量有所增加,但其执行效率更高

2
单选题号 #13004
分值 2

下面C++代码以递归方式实现合并排序,并假设 merge (int T[], int R[], int s, int m, int t) 函数将有序(同样排序规则)的T[s..m]和T[m+1..t]归并到R[s..t]中。横线处应填上代码是

void mergesort(int SList[], int TList[], int s, int t, int len) {
 if (s == t) {
 TList[s] = SList[s];
 return;
 }
 int *T2 = new int[len]; // 保存中间结果
 int m = (s + t) / 2;
 __________________________________________________________;
 merge(T2, SList, s, m, t);
 delete T2;
 return;
}
A

mergeSort(SList, T2, s, m,len), mergeSort(SList, T2, m,t,len)

B

mergeSort(SList, T2, s, m-1,len), mergeSort(SList, T2, m+1,t,len)

C

mergeSort(SList, T2, s, m,len), mergeSort(SList, T2, m+1,t,len)

D

mergeSort(SList, T2, s, m-1,len), mergeSort(SList, T2, m-1,t,len)

3
单选题号 #13005
分值 2

阅读下面的C++代码,执行后其输出是

int stepCount = 0;

int fracA(int N) {
 stepCount += 1;
 cout ";
 int rtn = 1;
 for(int i = 1; i ";
 if(N == 1) {
 return 1;
 }
 return N * fracB(N - 1);
}

int main() {
 cout ";
 cout << fracB(5);
 return 0;
}
A

1->1202->120

B

1->1201->120

C

1->1201->2->3->4->5->120

D

1->1202->3->4->5->6->120

4
单选题号 #13006
分值 2

下面的C++代码使用数组模拟整数加法,可以处理超出大整数范围的加法运算。横线处应填入代码是

vector operator +(vector a, vector b) {
 vector c;
 int t = 0;
 for(int i = 0; i < a.size() || i < b.size(); i++) {
 if(i < a.size()) t = t + a[i];
 if(i < b.size()) t = t + b[i];
 ________________________
 }
 if(t) c.push_back(t);
 return c;
}
A

c.push_back(t % 10), t = t % 10;

B

c.push_back(t / 10), t = t % 10;

C

c.push_back(t / 10), t = t / 10;

D

c.push_back(t % 10), t = t / 10;

5
单选题号 #13007
分值 2

下面的C++用于对 lstA 排序,使得偶数在前奇数在后,横线处应填入

bool isEven(int N) {
 return N % 2 == 0;
}

void swap(int &a, int &b) {
 int t;
 t = a, a = b, b = t;
 return;
}

void sortA(int lstA[], int n) {
 int i, j, t;
 for( i = n-1; i > 0; i--) {
 for(j = 0; j < i; j++) {
 if(_______________) {
 swap(lstA[j], lstA[j+1]);
 }
 }
 }
 return;
}
A

isEven(lstA[j]) && !isEven(lstA[j+1])

B

!isEven(lstA[j]) && isEven(lstA[j+1])

C

lstA[j] > lstA[j+1]

D

lstA[j] < lstA[j+1]

6
单选题号 #13008
分值 2

下面的C++代码用于将字符串保存到带头节点的双向链表中,并对重复的串计数,然后将最新访问的串的节点放在链头便于查找。横线处应填入代码是

typedef struct Node {
 string str;
 int ref;
 struct Node *next, *prev;
} Node;

Node * Insert(Node *pHead, string s) {
 Node *p = pHead->next;
 Node *q;
 while(p) {
 if(p->str == s) {
 p->ref++;
 p->next->prev = p->prev;
 p->prev->next = p->next;
 break;
 }
 p = p->next;
 }
 if (!p) {
 p = new Node;
 p->str = s;
 p->ref = 0;
 p->next = p->prev = NULL;
 
 }
 ________________________________
 pHead->next = p, p->prev = pHead;
 return pHead;
}
A

if(pHead) {p->next = pHead->next, pHead->next->prev = p;}

B

if(pHead->next) {p->next = pHead->next, pHead->next->prev = p;}

C

p->next = pHead->next, pHead->next->prev = p;

D

触发异常,不能对空指针进行操作。

7
单选题号 #13009
分值 2

有关下面C++代码说法正确的是

int rc;
int foo(int x, int y) {
 int r;
 if (y == 0) {
 r = x;
 } 
 else {
 r = foo(y, x % y);
 rc++;
 }
 return r;
}
A

如果 x 小于10, rc 值也不会超过20

B

foo 可能无限递归

C

foo 可以求出 x 和 y 的最大公共质因子

D

foo 能够求出 x 和 y 的最小公倍数

8
单选题号 #13010
分值 2

下面的C++代码实现对list的快速排序,有关说法,错误的是

vector operator+(vector lA, vector lB) {
 vector lst;
 for(int i = 1; i qSort(vector lst) {
 if(lst.size() less, greater;
 for (int i = 1; i < lst.size(); i++) {
 if (lst[i] <= pivot) {
 less.push_back(lst[i]);
 } else {
 greater.push_back(lst[i]);
 }
 }
 for (int i = 1; i < lst.size(); i++) {
 if (lst[i] <= pivot) {
 less.push_back(lst[i]);
 } else {
 greater.push_back(lst[i]);
 }
 }
 return______________________________;
}
A

qSort(less) + qSort(greater) + (vector)pivot

B

(vector)pivot + (qSort(less) + qSort(greater))

C

(qSort(less) + (vector)pivot + qSort(greater))

D

qSort(less) + pivot + qSort(greater)

9
单选题号 #13011
分值 2

下面C++代码中的 isPrimeA() 和 isPrimeB() 都用于判断参数N是否素数,有关其时间复杂度的正确说法是

bool isPrimeA(int N) {
 if (N < 2) {
 return false;
 }
 for (int i = 2; i <= N / 2; i++) {
 if (N % i == 0) {
 return false;
 }
 }
 return true;
}

bool isPrimeB(int N) {
 if (N < 2) {
 return false;
 }
 for (int i = 2; i <= sqrt(N); i++) {
 if (N % i == 0) {
 return false;
 }
 }
 return true;
}
A

A.isPrime()的最坏时间复杂度是O(N2)O(\frac{N}{2}),isPrimeB()的最坏时间复杂度是O(log⁡N)O(\log N),isPrimeA()优
于isPrimeB()

B

isPrimeA()的最坏时间复杂度是O(N2)O(\frac{N}{2}),isPrimeB()的最坏时间复杂度是O(N12)O(N^\frac{1}{2}),,isPrimeB()绝大多数情况下优于isPrimeA()

C

isPrimeA() 的最坏时间复杂度是 O(N12)O(N^\frac{1}{2}), isPrimeB( ) 的最坏时间复杂度是 O(N)O(N), isPrimeA( ) 优于isPrimeB( )

D

isPrimeA() 的最坏时间复杂度是O(logN)O(logN) , isPrimeB( ) 的最坏时间复杂度是O(N)O(N) , isPrimeA() 优于
isPrimeB( )

10
单选题号 #13012
分值 2

下面C++代码用于有序 list 的二分查找,有关说法错误的是

int _binarySearch(vector lst, int Low, int High, int Target) {
 if (Low > High) {
 return -1;
 }
 int Mid = (Low + High) / 2;
 if (Target == lst[Mid]) {
 return Mid;
 } else if (Target lst, int Val) {
 return _binarySearch(lst, 0, lst.size() - 1, Val);
}
A

代码采用二分法实现有序 list 的查找

B

代码采用分治算法实现有序 list 的查找

C

代码采用递归方式实现有序 list 的查找

D

代码采用动态规划算法实现有序 list 的查找

🔒

已解锁前 10 题

第 11~27 题(共 17 题)可在考试中作答
本卷为普通试卷:注册用户每题扣 1 积分(每日登录送 30 体验积分),交卷后查看答案与解析
海小星AI平台海小星AI平台

点亮AI梦想,编程未来之星。专业的青少年AI编程教育平台。

课程方向

  • AIGC人工智能
  • Scratch图形化
  • Python编程
  • C++/NOIP竞赛

联系我们

  • 北京市西城区万博苑7号楼3层F28室
  • +86-010-83553010
  • contact@seanova.cn

© 2026 海小星AI平台|京ICP备2022032747号

隐私政策服务条款