使用偏移量100时加密输出不符合预期的技术求助
凯撒密码偏移异常问题:乱码原因与修复方案
嘿,我帮你分析下这个凯撒密码的问题哈——你遇到的集合2乱码(汉字输出),核心是代码里的字符边界处理和偏移量逻辑出了问题。先梳理下你的测试用例,再拆解问题根源,最后给你修复后的代码:
你的测试用例
- 集合1:输入
abcde、偏移量128,预期/实际输出均为abcde(输出正确) - 集合2:输入
abcde、偏移量100,预期输出EFGHI,实际输出芦卢颅庐炉(异常) - 集合3:输入
Hello World、偏移量3,预期/实际输出均为Khoor#Zruog(输出正确)
问题出在哪?
看你贴的代码,有三个关键错误:
- 偏移量取模错误:你写了
distance %= 56,但凯撒密码应该针对单个字母表(26个字符)取模,不是把大小写字母凑成56个来算,这会导致偏移量的循环逻辑混乱。 - 只处理小写字母的边界:代码只判断了
cipherValue > ord('z')的情况,完全没考虑大写字母,也没先判断当前字符是大写还是小写。当偏移量很大时(比如100),小写a的ASCII码是97,97+100=197,远超过z的ASCII码122,你的手动调整逻辑算出来的数值落在了中文编码的范围内,所以输出了汉字乱码。 - 边界循环逻辑错误:你用
ord('a') + distance -(ord('z') - ordValue + 1)来处理越界,这个公式本身就不对,正确的循环应该基于26个字母的长度取模,而不是手动算差值。
修复后的代码
下面是修正后的代码,会区分大小写字母分别处理,非字母字符保持你集合3里的直接偏移行为:
plainText = input("Enter text to encrypt: ") distance = int(input("Enter number of offset: ")) code = "" for ch in plainText: if ch.islower(): # 处理小写字母:基于a的ASCII码取模循环 base = ord('a') cipherValue = (ord(ch) - base + distance) % 26 + base elif ch.isupper(): # 处理大写字母:基于A的ASCII码取模循环 base = ord('A') cipherValue = (ord(ch) - base + distance) % 26 + base else: # 非字母字符直接加偏移量,和你集合3的行为一致 cipherValue = ord(ch) + distance code += chr(cipherValue) print("distance= ", distance) print(code)
额外说明
关于集合2的预期输出EFGHI:100模26等于22,所以abcde偏移22后应该是wxyza。如果你的预期是大写的EFGHI,那可能是偏移量应该是4(而不是100),或者你需要强制把输出转成大写——可以把code += chr(cipherValue)改成code += chr(cipherValue).upper(),这样就能得到大写结果了。
另外集合1的偏移量128,128模26等于24,修复后的代码会输出yzabc,如果你的预期是abcde,那可能是偏移量需要是130(130模26等于0,相当于无偏移),或者你可以根据自己的需求调整取模逻辑。
内容的提问来源于stack exchange,提问作者JohnDoe
相关产品推荐
相关产品推荐

