2024年9月CCF—GESP(Python五级)编程能力等级认证试卷
五级
2024
2025-02-20 13:02:56
36次
一、单选题
下面程序是对n!进行唯一分解,横线处应该填入的是( )。
def unique_fac(n):
print(n, '=', end='')
for i in range(2, n + 1):
_____________________________
print(' {}*'.format(i), end='')
n //= i
if n % i == 0 and i == n:
print(' {}'.format(i), end='')
break
unique_fac(math.factorial(5))| A. while n % i != 0 and i != n: |
B. while n % i == 0 and i == n: |
| C. while n % i == 0 and i != n: |
D. while n % i != 0 and i == n: |
【知识点】 CCF—GESP Python五级
下列快速排序算法中,横线处应该填入的是( )。
def quick(arr): if len(arr) <= 1: return arr ____________________ left = [x for x in arr if x < p] middle = [x for x in arr if x == p] right = [x for x in arr if x > p] return quick(left) + middle + quick(right)
| A. p = arr[len() // 2] |
B. p = arr[len(arr)+1 // 2] |
| C. p = arr[len(arr)-1 // 2] |
D. p = arr[len(arr) // 2] |
【知识点】 CCF—GESP Python五级
下面代码是寻找水仙花数的程序,横线处应该填写的代码是( )。【是指一个n位数(n≥3),其每位数字的n次幂之和等于它本身】
def is_narcissistic_num(num): str_num = str(num) num_digits = len(str_num) ———————————————————————————— return num == sum_of_powers for i in range(100, 10000): if is_narcissistic_num(i): print(i, "是水仙花数")
| A. sum_of_powers = sum(int(digit) ** num_digits for digit in num) |
B. sum_of_powers = sum(int(digit) ** num for digit in str_num) |
| C. sum_of_powers = sum(int(num) ** num_digits for digit in str_num) |
D. sum_of_powers = sum(int(digit) ** num_digits for digit in str_num) |
【知识点】 CCF—GESP Python五级
下列程序是素数筛的程序,横线处应该填上( )。
def sieve(n): if n < 2: return [] prime = [True] * (n+1) prime[0] = prime[1] = False for i in range(2, int(math.sqrt(n)) + 1): if prime[i]: _______________________ prime[j] = False return [p for p in range(2, n+1) if prime[p]] for prime in sieve_of_eratosthenes(100): print(prime)
| A. for j in range(i, n+1, i): |
B. for j in range(ii, 1, n): |
| C. for j in range(ii, n+1, i): |
D. for j in range(i, n, i): |
【知识点】 CCF—GESP Python五级
下面程序是埃氏筛的一个实现,横线处应该填写( )。
n = 10**8 s = [0]*(n+1) k=0 for i in range(2,n+1): if s[i]==0: k+=1 ___________________________ s[j]=1
| A. for i in range(i*i,n+1,i): |
B. for j in range(i*i,n,j): |
| C. for j in range(i*i,n+1,i): |
D. for j in range(j*j,n+1,i): |
【知识点】 CCF—GESP Python五级
下列归并算法程序中,横线处应该填入的是( )。
def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = arr[:mid] right = arr[mid:] merge_sort(left) merge_sort(right) return merge(left, right) def merge(left, right): result = [] i, j = 0, 0 ——————————————————————————————— if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return result
| A. while i > len(left) and j < len(right): |
B. while i < len(left) and j > len(right): |
| C. while i > len(left) and j > len(right): |
D. while i < len(left) and j < len(right): |
【知识点】 CCF—GESP Python五级
下列程序中,使用了二分查找算法,横线处应该填写的是()。
def search(arr, x): low = 0 high = len(arr) - 1 while low <= high: __________________ if arr[mid] == x: return mid elif arr[mid] > x: high = mid - 1 else: low = mid + 1 return -1
| A. mid = (low - high) // 2 |
B. mid = (low + high) // 2 |
| C. mid = (low + high) / 2 |
D. mid = (low - high) / 2 |
【知识点】 CCF—GESP Python五级
一名收银员,给顾客找零,找零的目标是给出确定金额的同时,使用尽可能少的硬币。有不同面额的硬币:1分,5分,10分,25分.如果需要给顾客准确的零钱77分,同时使用最少的硬币下列程序中横线应该填写( )。
def coin_change(amount, coins): result = [] for coin in sorted(coins, reverse=True): while amount >= coin: ___________________ result.append(coin) return result coins = [1, 5, 10, 25] amount = 63
| A. amount -= coin |
B. amount <= coin |
| C. amount >= coin |
D. amount += coin |
【知识点】 CCF—GESP Python五级
假设有⼀些物品,每个物品都有⾃⼰的重量,我们需要将这些物品装⼊箱⼦中,每个箱⼦也有⾃⼰的重量限制。贪⼼算法每次都选择重量最轻的物品放⼊当前最轻的箱⼦中,如果箱⼦可以装下,就放⼊;如果箱⼦不能装下,就尝试下⼀个箱⼦,直到找到可以放⼊的箱⼦。下列贪⼼算法程序中,横线处应该填⼊的是( )。

| A. if not taken[i] and box[0] >= items[i]: |
B. if not taken[0] and box[0] >= items[i]: |
| C. if not taken[i] and box[i] >= items[0]: |
D. if not taken[0] and box[0] >= items[i]: |
【知识点】 CCF—GESP Python五级
在升序数组 nums 中寻找目标值 target,下列程序可以填入的是( )
class Search(object): def search(self, nums, target): left, right = 0, len(nums) - 1 while left <= right: ________________________________________ if nums[mid] == target: return mid elif nums[mid] > target: right = mid - 1 else: left = mid + 1 return -1
| A. mid = (right + left) // 2 + left |
B. mid = (right - left) // 2 + left |
| C. mid = (right - left) // 2 -right |
D. mid = (right + left) // 2 - left |
【知识点】 CCF—GESP Python五级
下列二分枚举算法中,{ }处应该填入的程序是({}不算做程序的一部分)( )。
def binary_search(arr, x):
low = 0
high = len(arr) - 1
while low <= high:
{
}
return -1A.mid = (low + high) // 2 if arr[mid] == x: return mid elif arr[mid+1] > x: high = mid - 1 else: low = mid + 1 |
B.mid = (low + high) // 2 if arr[mid] != x: return mid elif arr[mid+1] > x: high = mid - 1 else: low = mid + 1 |
C.mid = (low + high) // 2 if arr[mid] == x: return mid elif arr[mid] > x: high = mid - 1 else: low = mid + 1 |
D.mid = (low + high) // 2 if arr[mid] != x: return mid elif arr[mid] > x: high = mid - 1 else: low = mid + 1 |
【知识点】 CCF—GESP Python五级
二、判断题
三、编程题
小杨的武器
时间限制:1.0 s
内存限制:512.0 MB
题面描述
小杨有n种不同的武器,他对第i种武器的初始熟练度为c。
小杨会依次参加m场战斗,每场战斗小杨只能且必须选择一种武器使用,假设小杨使用了第i种武器参加了第j场战斗,战斗前该武器的熟练度为ci′,则战斗后小杨对该武器的熟练度会变为ci′+a。需要注意的是,aj可能是正数,0或负数,这意味着小杨参加战斗后对武器的熟练度可能会提高,也可能会不变,还有可能降低。
小杨想请你编写程序帮他计算出如何选择武器才能使得m场战斗后,自己对n种武器的熟练度的最大值尽可能大。
输入格式
第一行包含两个正整数n,m,含义如题面所示。
第二行包含n个正整数c1,c2,...,cn,代表小杨对武器的初始熟练度。
第三行包含m个正整数a1,a2,...,am,代表每场战斗后武器熟练度的变化值。
输出格式
输出一个整数,代表m场战斗后小杨对n种武器的熟练度的最大值最大是多少。
输入样例
2 2 9 9 1 -1
输出样例
10
一种最优的选择方案为,第一场战斗小杨选择第一种武器,第二场战斗小杨选择第二种武器。

对于全部数据,保证有1≤n,m≤105,−104≤ci,ai≤104。
【知识点】 CCF—GESP Python五级
挑战怪物
时间限制:1.0 s
内存限制:512.0 MB
题面描述
小杨正在和一个怪物战斗,怪物的血量为h,只有当怪物的血量恰好为 0 时小杨才能够成功击败怪物。
小杨有两种攻击怪物的方式:
·物理攻击。假设当前为小杨第i次使用物理攻击,则会对怪物造成2i−1点伤害。
·魔法攻击。小杨选择任意一个质数x(x不能超过怪物当前血量),对怪物造成x点伤害。由于小杨并不擅长魔法,他只能使用至多一次魔法攻击。
小杨想知道自己能否击败怪物,如果能,小杨想知道自己最少需要多少次攻击。
输入格式
第一行包含一个正整数t,代表测试用例组数。
接下来是t组测试用例。对于每组测试用例,第一行包含一个正整数h,代表怪物血量。
输出格式
对于每组测试用例,如果小杨能够击败怪物,输出一个整数,代表小杨需要的最少攻击次数,如果不能击败怪物,输出 -1。
输入样例
3 6 188 9999
输出样例
2 4 -1
对于第一组测试用例,一种可能的最优方案为,小杨先对怪物使用魔法攻击,选择质数 5 造成 5 点伤害,之后对怪物使用第 1 次物理攻击,造成21−1=1 点伤害,怪物血量恰好为 0,小杨成功击败怪物。

对于全部数据,保证有1≤t≤10,1≤h≤105。
【知识点】 CCF—GESP Python五级
