凯撒密码Python代码对字母'z'加密异常的问题排查
凯撒密码Python代码对字母'z'加密异常的问题排查
嘿,我来帮你揪出这段代码的问题所在~
首先看你处理字母表范围溢出的逻辑,这里完全走偏啦!当new_index > 25的时候,你写了一个循环把new_index从0一直赋值到25,循环结束后new_index会固定变成25(也就是回到字母'z'),这就是为什么输入'z'时加密后还是'z',而不是你期望的'e'。
举个具体例子:假设你输入'z'(对应索引25),shift设为5,那index + shift等于30,本来应该绕回字母表开头得到30-26=4(对应字母'e'),但你的循环最后把new_index硬改成了25,结果自然还是'z',这就导致整个加密结果出错。
那怎么修复呢?其实不用复杂的循环,用取模运算就能完美解决范围溢出的问题,它会自动帮你把超出0-25的数值绕回字母表范围内:
把计算new_index的代码改成:
new_index = (index + shift) % 26
另外,还有个小细节要注意:如果输入的文本里包含非字母字符(比如空格、标点),alphabet.index(char)会直接报错,因为这些字符不在你的字母列表里。如果要兼容这种情况,可以加个判断逻辑,把非字母字符直接保留下来:
修改后的完整代码如下:
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: if char in alphabet: index = alphabet.index(char) new_index = (index + shift) % 26 cipher_text += alphabet[new_index] else: # 非字母字符直接保留 cipher_text += char print(cipher_text) encrypt(text, shift)
现在测试输入'zulu'、shift设为5,就能得到你期望的'ezqz'啦!
备注:内容来源于stack exchange,提问作者Haha Lol
相关产品推荐
相关产品推荐

