GESP2024年09月Python五级试卷

从PDF导入:GESP2024年09月Python五级试卷

Python 180分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2.0分 单选
在升序数组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
第2题 中级 2.0分 单选
500个病毒样本中,已知有一个是病毒检测呈阳性,用试纸测试阳性病毒以后,试纸在3天以后会变色,用试纸测试时间不计,三天以后要出结果,请问最少用多少个试纸能够找出
A. 499
B. 250
C. 9
D. 125
第3题 中级 2.0分 单选
一名收银员,给顾客找零,找零的目标是给出确定金额的同时,使用尽可能少的硬币。有不同面额的硬币: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
第4题 中级 2.0分 单选
下列程序是素数筛的程序,横线处应该填上( )。

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]]

A. for j in range(i, n+1, i):
B. for j in range(i*i, 1, n):
C. for j in range(i*i, n+1, i):
D. for j in range(i, n, i):
第5题 中级 2.0分 单选
下面程序是埃氏筛的一个实现,横线处应该填写( )。

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):
第6题 中级 2.0分 单选
下列程序中,使用了二分查找算法,横线处应该填写的是( )。

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
第7题 中级 2.0分 单选
正整数1024的所有约数的和为多少?( )
A. 2050
B. 2059
C. 2047
D. 2044
第8题 中级 2.0分 单选
下面程序是对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:
第9题 中级 2.0分 单选

假设有⼀些物品,每个物品都有⾃⼰的重量,我们需要将这些物品装⼊箱⼦中,每个箱⼦也有⾃⼰的重量限制。贪⼼算法每次都选择重量最轻的物品放⼊当前最轻的箱⼦中,如果箱⼦可以装下,就放⼊;如果箱⼦不能装下,就尝试下⼀个箱⼦,直到找到可以放⼊的箱⼦。下列贪⼼算法程序中,横线处应该填⼊的是( )。

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]:
第10题 中级 2.0分 单选
下列归并算法程序中,横线处应该填入的是( )。

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):
第11题 中级 2.0分 单选
下列快速排序算法中,横线处应该填入的是( )。

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]
第12题 中级 2.0分 单选
下列二分枚举算法中,{}处应该填入的程序是( )。

def binary_search(arr, x):
low = 0
high = len(arr) - 1
while low <= high:
# {}处填入
return -1

A. 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
第13题 中级 2.0分 单选
下面代码是寻找水仙花数的程序,横线处应该填写的代码是( )。【水仙花数是指一个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)
第14题 中级 2.0分 单选
对于正整数n,欧拉函数f(n)表示小于或等于n的正整数中与n互质的数的数目,例如f(8)=4。f(100)=( )。
A. 50
B. 55
C. 45
D. 40
第15题 中级 2.0分 单选
下列程序输出的是( )。

def reverse(string):
if len(string) == 0:
return
temp = string[0]
reverse(string[1:])
print(temp, end='')
string = "chen a dai"
reverse(string)

A. chen a dai
B. dai a chen
C. iad a nehc
D. chenadai
第16题 中级 2.0分 判断
(-1) mod 127和126 mod 127的结果是一样的。( )
T. 正确
F. 错误
第17题 中级 2.0分 判断
一个数的反码,实际上是这个数对于一个模的同余数。( )
T. 正确
F. 错误
第18题 中级 2.0分 判断
1997和615用欧几里得算法计算最大公约数的过程正确。( )

1997/615=3(余152)
615/152=4(余7)
152/7=21(余5)
7/5=1(余2)
5/2=2(余1)
2/1=2(余0)
得出最大公约数是1

T. 正确
F. 错误
第19题 中级 2.0分 判断
欧几里得算法适用于实数。( )
T. 正确
F. 错误
第20题 中级 2.0分 判断
每个大于1的整数可以唯一地写成质数的乘积的形式。( )
T. 正确
F. 错误
第21题 中级 2.0分 判断
贪婪算法的复杂度通常是线性的,即O(n)。( )
T. 正确
F. 错误
第22题 中级 2.0分 判断
归并排序的时间复杂度为O(n log n)。( )
T. 正确
F. 错误
第23题 中级 2.0分 判断
根据同余计算,可以推导出(a*b)%m=(a%m*b%m)%m。( )
T. 正确
F. 错误
第24题 中级 2.0分 判断
二分查找算法的复杂度通常表示为O(log n)。( )
T. 正确
F. 错误
第25题 中级 2.0分 判断
def(十六进制) = 103231(五进制)。( )
T. 正确
F. 错误
第26题 中级 25.0分 编程
小杨的武器

时间限制:1.0 s
内存限制:512.0 MB
题面描述
小杨有n种不同的武器,他对第i种武器的初始熟练度为ci。小杨会依次参加m场战斗,每场战斗小杨只能且必须选择一种武器使用,假设小杨使用了第i种武器参加了第j场战斗,战斗前该武器的熟练度为bj,则战斗后小杨对该武器的熟练度会变为bj+aj。小杨想请你编写程序帮他计算出如何选择武器才能使得m场战斗后,自己对n种武器的熟练度的最大值尽可能大。

【输入格式】
第一行包含两个正整数n, m,含义如题面所示。
第二行包含n个正整数ci,代表小杨对武器的初始熟练度。
第三行包含m个正整数aj,代表每场战斗后武器熟练度的变化值。
【输出格式】
输出一个整数,代表m场战斗后小杨对n种武器的熟练度的最大值最大是多少。
【样例】
样例输入
2 2
9 9
1 -1
样例输出
10
数据范围
对于全部数据,保证有1 ≤ n, m ≤ 10⁵,1 ≤ ci ≤ 10⁹,-10⁹ ≤ aj ≤ 10⁹。
第27题 中级 25.0分 编程
挑战怪物

时间限制:1.0 s
内存限制:512.0 MB
题面描述
小杨正在和一个怪物战斗,怪物的血量为x,只有当怪物的血量恰好为0时小杨才能够成功击败怪物。小杨有两种攻击怪物的方式:物理攻击,假设当前为小杨第i次使用物理攻击,则会对怪物造成2^(i-1)点伤害;魔法攻击,小杨选择任意一个质数p(p不能超过怪物当前血量),对怪物造成p点伤害。由于小杨并不擅长魔法,他只能使用至多一次魔法攻击。小杨想知道自己能否击败怪物,如果能,小杨想知道自己最少需要多少次攻击。

【输入格式】
第一行包含一个正整数t,代表测试用例组数。
接下来是t组测试用例。对于每组测试用例,第一行包含一个正整数x,代表怪物血量。
【输出格式】
对于每组测试用例,如果小杨能够击败怪物,输出一个整数,代表小杨需要的最少攻击次数,如果不能击败怪物,输出-1。
【样例】
样例输入
3
6
188
9999
样例输出
2
4
-1
数据范围
对于全部数据,保证有1 ≤ t ≤ 10⁴,1 ≤ x ≤ 10⁵。
💬