2025年3月CCF—GESP(Python五级)编程能力等级认证试卷
五级
2025
2025-06-19 16:04:49
94次
一、单选题
下述代码实现素数表的线性筛法,筛选出所有小于等于 的素数,横线上应填的最佳代码是( )。
def sieve_linear(n): is_prime = [True] * (n + 1) primes = [] if n < 2: return primes # is_prime[0] = is_prime[1] = False for i in range(2, n // 2 + 1): if is_prime[i]: primes.append(i) j = 0 _____________________________________ is_prime[i * primes[j]] = False if i % primes[j] == 0: break j += 1 for i in range(n // 2 + 1, n + 1): if is_prime[i]: primes.append(i) return primes
| A. while j < len(primes) and j * primes[j] <= n: |
B. while j < len(primes) and i * primes[j] <= n: |
| C. while j < len(primes) and j * primes[i] <= n: |
D. while i < len(primes) and i * primes[j] < n: |
【知识点】 CCF—GESP Python五级
小杨编写了一个如下的高精度乘法函数,则横线上应填写的代码为( )。
def multiply(a, b): m, n = len(a), len(b) c = [0] * (m + n) for i in range(m): for j in range(n): c[i + j] += a[i] * b[j] carry = 0 for k in range(len(c)): ———————————————————— c[k] = temp % 10 carry = temp // 10 while len(c) > 1 and c[-1] == 0: c.pop() return c
| A. temp = c[k] |
B. temp = c[k] + carry |
| C. temp = c[k] - carry |
D. temp = c[k] * carry |
【知识点】 CCF—GESP Python五级
函数 def find_max(arr, low, high): 计算数组中最大元素,其中数组 arr 从索引 low 到 high ,()正确实现了分治逻辑。
A.def find_max(arr, low, high): if low = high: return arr[low] mid = low + (high - low) // 2 left_max = find_max(arr, low, mid) right_max = find_max(arr, mid, high) return left_max if left_max > right_max else right_max |
B.def find_max(arr, low, high): if low == high: return arr[low] mid = low + (high - low) // 2 left_max = find_max(arr, low, mid) right_max = find_max(arr, mid, high) return left_max if left_max > right_max else right_max |
C.def find_max(arr, low, high): if low == high: return arr[low] mid = low + (high - low) // 2 left_max = find_max(arr, low, mid) right_max = find_max(arr, mid - 1, high) return left_max if left_max > right_max else right_max |
D.def find_max(arr, low, high): if low == high: return arr[low] mid = low + (high - low) // 2 left_max = find_max(arr, low, mid) right_max = find_max(arr, mid + 1, high) return left_max if left_max > right_max else right_max |
【知识点】 CCF—GESP Python五级
下面的python代码实现了二分查找算法,在数组 arr 找到目标元素 target 的位置,则横线上能填写的最佳代码是( )。
def binary_search(arr, left, right, target): while left <= right: _________________________ if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1
| A. mid = left + (right - left) // 2 |
B. mid = left; |
| C. mid = (left + right) // 2 + 1; |
D. mid = right; |
【知识点】 CCF—GESP Python五级
考虑以下python代码实现的快速排序算法,将数据从小到大排序,则横线上应填的最佳代码是( )。
def partition(arr, low, high): pivot = arr[high] i = low - 1 for j in range(low, high): _________________________________ arr[i + 1], arr[high] = arr[high], arr[i + 1] return i + 1 def quick_sort(arr, low, high): if low < high: pi = partition(arr, low, high) quick_sort(arr, low, pi - 1) quick_sort(arr, pi + 1, high)
A.if arr[i] < pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] |
B.if arr[j] < pivot: j += 1 |
C.if arr[i] < pivot: j += 1 arr[i], arr[i] = arr[j], arr[i] |
D.if arr[j] < pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] |
【知识点】 CCF—GESP Python五级
对下面两个函数,说法错误的是( )。
def factorialA(n): if n <= 1: return 1 return n * factorialA(n - 1) def factorialB(n): if n <= 1: return 1 res = 1 for i in range(2, n + 1): res *= i return res
| A. 两个函数的实现的功能相同。 |
B. 两个函数的时间复杂度均为 。 |
| C. factorialA采用递归方式。 |
D. factorialB采用递归方式。 |
【知识点】 CCF—GESP Python五级
双向链表中每个结点有两个指针域 prev 和 next ,分别指向该结点的前驱及后继结点。设 p 指向链表中的一个结点,它的前驱结点和后继结点均非空。现要求删除结点 p ,则下述语句中错误的是( )。
A.class Node: def __init__(self, value): self.value = value self.prev = None self.next = None if p.next: p.next.prev = p.prev if p.prev: p.prev.next = p.next p = None |
B.class Node: def __init__(self, value): self.value = value self.prev = None self.next = None if p.next: p.next.next = p.prev if p.prev: p.prev.next = p.next p = None |
C.class Node: def __init__(self, value): self.value = value self.prev = None self.next = None if p.next: p.next.prev = p.prev if p.prev: p.prev.next = p.prev p = None |
D.class Node: def __init__(self, value): self.value = value self.prev = None self.next = None if p.next: p.next.prev = p.next if p.prev: p.prev.next = p.next p = None |
【知识点】 CCF—GESP Python五级
假设双向循环链表包含头尾哨兵结点(不存储实际内容),分别为 head 和 tail ,链表中每个结点有两个指针域 prev 和 next ,分别指向该结点的前驱及后继结点。下面代码实现了一个空的双向循环链表,横线上应填的最佳代码是( )。
class ListNode: def __init__(self, val=None): self.data = val self.prev = None self.next = None class LinkedList: def __init__(self): self.head = ListNode() self.tail = ListNode() _______________________ _______________________ def init_linked_list(): return LinkedList()
| A. self.head.next = self.tail self.tail.prev = self.head |
B. self.head.next = self.tail self.tail.next = self.head |
| C. self.head.next = self.head self.tail.prev = self.tail |
D. self.head.prev = self.tail self.tail.next = self.head |
【知识点】 CCF—GESP Python五级
二、判断题
三、编程题
平均分配
题目描述
小 A 有2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i件物品,小 B 会以bi 的价格购买,而小 C 会以 ci的价格购买。为了平均分配这 2n件物品,小 A 决定小 B 和小 C 各自只能买走恰好n 件物品。你能帮小 A 求出他卖出这 2n件物品所能获得的最大收入吗?
输入格式
第一行,一个正整数n 。
第二行, 2n个整数b1,b2,...,b2n 。
第三行,2n 个整数 c1,c2,...,c2n。
输出格式
一行,一个整数,表示答案。
输入样例 1
3
1 3 5 6 8 10
2 4 6 7 9 11
输出样例 1
36
输入样例 2
2
6 7 9 9
1 2 10 12
输出样例 2
35
数据范围
对于20 % 的测试点,保证1 ≤n≤8。
对于另外20 % 的测试点,保证 0≤bi≤1,0≤ci≤1 。
对于所有测试点,保证 1 ≤n≤105,0≤bi≤109,0 ≤ci≤109 。
【知识点】 CCF—GESP Python五级
原根判断
题目描述
小 A 知道,对于质数p 而言,p 的原根g 是满足以下条件的正整数:
·1<g<p
·gp-1 mod p=1
·对于任意1≤i<p-1 均有 gi mod p≠1。
其中a mod p 表示a 除以 p的余数。
小 A 现在有一个整数a ,请你帮他判断 a是不是p 的原根。
输入格式
第一行,一个正整数 T,表示测试数据组数。
每组测试数据包含一行,两个正整数a ,p 。
输出格式
对于每组测试数据,输出一行,如果 a是 p的原根则输出 Yes ,否则输出 No 。
输入样例
3 3 998244353 5 998244353 7 998244353
输出样例
Yes Yes No
数据范围
对于 40% 的测试点,保证3≤p≤103 。
对于所有测试点,保证1≤T≤20 ,3≤p≤109,1<a<p ,p为质数。
【知识点】 CCF—GESP Python五级
