深耕专业教研,探索前沿技术
信息技术来源:2026年5月浙江省普通高中适应性考试(义乌柯桥)

第 11 题

答案与解析

本题解析

参考答案

C

程序分析

n,m = len(lst),len(key)
t = [""] * m
for i in range(n):
    ...

n为字符总数,m为密钥长度,t初始化为含m个空字符串的列表。循环按下标i依次处理lst中的字符。

k = i % m
t[k] = chr((ord(lst[i])-97+key[k])%26+97) #字符"a"的ASCII码是97

k随i循环取0到m-1,表示当前字符在每组m个字符中的位置。ord(lst[i])-97把小写字母转换为0到25的序号,加上key[k]并对26取余,实现字母在a到z范围内的循环移位;再转换回字符存入t[k]。因此t按组内原位置暂存移位后的字符。

if k == m - 1:
    for j in range(m):
        lst[i - m + 1 + key[j]] = t[j]

k等于m-1时,一整组字符已处理完。i-m+1是本组在lst中的起始下标,程序把t[j]写到组内下标key[j]处。因此key不仅决定字符的移位量,还决定完整组中字符写回的位置。写回发生在整组读取完之后,不会影响本组尚未读取的字符。

r = n % m
for j in range(r):
    lst[n - r + j] = t[j]
print(lst)

r是末尾不足一组的字符个数,n-r是这部分的起始下标。程序将t的前r个字符按原先后次序写回这些位置,不再按key调整位置。若r为0,这个循环不执行。

本题n=5、m=3,先处理完整组['a','p','p'],再处理末尾的['l','e']。

完整组按key=[2,0,1]进行字符移位:'a'移2位得到'c','p'移0位仍为'p',另一个'p'移1位得到'q',此时t=['c','p','q']。写回时,'c'放到组内下标2,'p'放到下标0,'q'放到下标1,所以前三个元素变为['p','q','c']。

末尾两字符中,'l'移2位得到'n','e'移0位仍为'e'。此时r=2,只将t[0]、t[1]依次写回lst[3]、lst[4],t[2]中上一组留下的'q'不参与写回。最终输出['p','q','c','n','e']。