alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
text = input("Type your message:\n").lower()
shift = int(input("Type the shift number:\n"))
def encrypt(text,shift):
cipher_text = ""
for char in text:
index = alphabet.index(char)
new_index = index + shift
if new_index > 25: -------->>
for numba in range(0,26):
new_index = numba
cipher_text += alphabet[new_index]
print(cipher_text)
encrypt(text,shift)
如果我输入“zulu”,这段代码有什么问题,它会将其加密为“zzqz”而不是“ezqz”,这里有什么问题,我无法弄清楚。
我期望它打印“ezqz”。
问题出在处理大于 25 的
new_index
值的方式。当
new_index
大于 25 时,希望它回绕到字母表的开头。但是的代码是这样的:
if new_index > 25:
for numba in range(0,26):
new_index = numba
这段代码没有将
new_index
设置为回绕后的正确索引,而是将其设置为循环的最后一个值,即 25。这就是为什么会得到 'z' 而不是 'e'。
要解决此问题,应该使用模运算符 (
%
) 来回绕字母表:
new_index = (index + shift) % 26
这将确保
new_index
始终在 0 到 25 的范围内,从而实现正确的回绕效果。
以下是使用此更正的完整代码:
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
text = input("Type your message:\n").lower()
shift = int(input("Type the shift number:\n"))
def encrypt(text,shift):
cipher_text = ""
for char in text:
index = alphabet.index(char)
new_index = (index + shift) % 26
cipher_text += alphabet[new_index]
print(cipher_text)
encrypt(text,shift)
使用此代码,当输入为“zulu”且移位为 4 时,将获得预期的输出“ezqz”。
标签:python From: 78772881