一、编程题
1、36.换位密码法是将明文中的字符位置通过一定的规则重新排列从而得到密文的一种加密方法。某换位密码法加密方法如下:先把明文按照固定长度(4位一组)进行分组,然后对每一组的字符进行换位操作,从而得到密文。例如, 字符串"ceit",使用密钥1432进行加密时,首先将字符串以 4 个字符为一组进行分组,然后对每组的字符进行换位,第1个和第3个字符位置不变,把第2个字符和第4个字符交换位置,从而得到密文"ctie"。小张编写的程序如下,请完善划线处的代码:
def jiami(yw,key):
result = ''
for i in range(0, ① ,len(key)):
s1=yw[i:i+ len(key) ]
for j in range( ② ):
result = result + ③
return result
yw= input('请输入待加密的明文:')
key= input('请输入密钥:')
mw= ④
print(mw)
运行结果如下图所示:
解析:【喵呜刷题小喵解析】:
1. 对于①,由于题目中要求将明文按照固定长度(4位一组)进行分组,因此我们需要将明文长度除以密钥长度,得到每组字符的数量。由于Python中整除使用双斜杠,所以应填入`len(yw)//len(key)`。
2. 对于②,题目要求对每组的字符进行换位操作,因此我们需要遍历每组字符。在Python中,可以使用`range(len(s1))`来生成一个从0到`len(s1)-1`的整数序列,用于遍历字符。
3. 对于③,题目要求根据密钥进行换位操作,因此我们需要将每组字符按照密钥指定的位置进行交换。在Python中,可以使用`s1[key[j]-1]`来获取换位后的字符。注意,由于Python的索引是从0开始的,因此需要将密钥值减1。
4. 对于④,题目要求调用`jiami`函数进行加密,并将加密结果赋值给`mw`变量。因此,应填入`jiami(yw,key)`。
2、37.一张长方形的纸,长m米,宽n米(长宽均为整数),现在要把它刚好裁成一些正方形(边长是整数),有几种裁法,如果要使裁得的正方形面积最大,可以裁多少块。小明学习了递归后,编写程序如下,首先输入长方形的长和宽,计算出结果。请完善划线处的代码:
def tj(a,b):
c = 0
minn = ①
if a > b:
minn = b
for i in range(1,minn+1):
if a % i == 0 and b % i == 0:
c = ②
return c
def gcd(a,b):
if b == 0:
return a
return ③
chang = int(input('输入长方形的长 (单位cm)'))
kuan = int(input('输入长方形的宽 (单位cm)'))
bianchang = gcd(chang,kuan)
total = ④
num = tj(chang,kuan)
print('------------结果如下-------------')
print('有{}种裁法'.format(num))
print('裁得的正方形面积最大边长是{}cm,可以裁{}块'.format(bianchang,total))
运行后的结果如下图所示:
参考答案:1. ①处应填`min(a, b)`,表示取长和宽的最小值作为正方形的最大可能边长。2. ②处应填`c + (a // i) * (b // i)`,表示当前边长i下,可以裁出的正方形数量,累加到c上。3. ③处应填`gcd(b, a % b)`,表示求最大公约数,递归调用gcd函数。4. ④处应填`(chang * kuan) // (bianchang * bianchang)`,表示计算可以裁出的最大面积正方形的数量。
解析:【喵呜刷题小喵解析】:
根据题目要求,需要完善划线处的代码。
1. ①处需要求长和宽的最小值,作为正方形的最大可能边长。因为长和宽中较小的那个值,就是能构成的最大正方形边长。所以填`min(a, b)`。
2. ②处需要计算当前边长i下,可以裁出的正方形数量。对于每个可能的边长i,需要判断长和宽是否能被i整除,如果能,就计算能裁出的正方形数量,累加到c上。公式为`c + (a // i) * (b // i)`,其中`a // i`和`b // i`分别表示长和宽能被i整除的部分数量,两者相乘就是能裁出的正方形数量。
3. ③处需要求最大公约数,递归调用gcd函数。因为最大公约数能表示长和宽的最大公约因子,也就是能构成的最大正方形的边长。
4. ④处需要计算可以裁出的最大面积正方形的数量。公式为`(chang * kuan) // (bianchang * bianchang)`,其中`chang * kuan`表示长方形的总面积,`bianchang * bianchang`表示最大面积正方形的面积,两者相除并取整就是能裁出的最大面积正方形的数量。
3、38.商超采用会员制,客户的消费信息如会员号、姓名和积分如下表所示,小方的爸爸想编写一个客户信息管理系统,其中有一个功能是:输入会员号,查询该会员的积分。
小方知道后,就跃跃欲试,他首先从数据库读取客户信息到列表data中,其中data[i][0]存储第i条记录的会员号,data[i][1]存储第i条记录的姓名,data[i][2]存储第i条记录的积分;他首先将数组data中数据按会员号升序排序,然后用二分查找算法查找会员号对应的积分信息。代码如下,完善划线处的代码:
def bubble_sort(d):
for i in range(len(d)-2):
for j in range(len(d)-1, ① ,-1):
if d[j][0] < d[j-1][0]:
d[j],d[j-1] = d[j-1],d[j]
def bin_ search(d, key):
i,j = 0, len(d)-1
while i <= j:
m=(i +j)//2
if ② :
return m
if key > d[m][0]:
i = m+1
else:
j = m-1
return -1
\#从数据库读取会员信息存列表data中,代码略
data=[[8011,'张飞',12345],[8012,'李强',34512],[7812,'李好',45321]]
bubble_sort(data)
key = int(input('输入会员号:'))
m = ③
if m!=-1:
print (data[m][1],'先生/女士:您的积分是:',data[m][2])
else:
print('该会员号不正确')
参考答案:1. ①处应填:i2. ②处应填:d[m][0] == key3. ③处应填:bin_search(data, key)
解析:【喵呜刷题小喵解析】:
首先,对于冒泡排序(Bubble Sort),它是通过相邻元素的比较和交换,将最大的元素“冒泡”到数组的最后,依此类推,直到整个数组排序完成。对于此题目,我们需要将数组按照会员号升序排序,因此,内部循环应该从`len(d)-1`递减到`1`,即`range(len(d)-1, i, -1)`。所以,①处应填`i`。
接下来,对于二分查找(Binary Search),它是一种在有序数组中查找特定元素的搜索算法。它首先比较数组中间的元素与目标值,如果中间元素正好是要查找的元素,则查找过程结束;如果目标值小于或大于中间元素,则在数组的小于或大于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果数组中没有这样的元素,则查找过程结束。根据题目,我们需要在排序后的数组中查找特定会员号对应的积分,因此,我们可以使用二分查找。对于②处,应填`d[m][0] == key`。
最后,我们需要调用`bin_search`函数来查找特定会员号对应的积分。所以,③处应填`bin_search(data, key)`。
完整的代码应该是:
```python
def bubble_sort(d):
for i in range(len(d)-1):
for j in range(len(d)-1, i, -1):
if d[j][0] < d[j-1][0]:
d[j],d[j-1] = d[j-1],d[j]
def bin_search(d, key):
i,j = 0, len(d)-1
while i <= j:
m=(i +j)//2
if d[m][0] == key:
return m
if key > d[m][0]:
i = m+1
else:
j = m-1
return -1
# 从数据库读取会员信息存列表data中,代码略
data=[[8011,'张飞',12345],[8012,'李强',34512],[7812,'李好',45321]]
bubble_sort(data)
key = int(input('输入会员号:'))
m = bin_search(data, key)
if m!=-1:
print (data[m][1],'先生/女士:您的积分是:',data[m][2])
else:
print('该会员号不正确')
```
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!