You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用偏移量100时加密输出不符合预期的技术求助

凯撒密码偏移异常问题:乱码原因与修复方案

嘿,我帮你分析下这个凯撒密码的问题哈——你遇到的集合2乱码(汉字输出),核心是代码里的字符边界处理和偏移量逻辑出了问题。先梳理下你的测试用例,再拆解问题根源,最后给你修复后的代码:

你的测试用例

  • 集合1:输入abcde、偏移量128,预期/实际输出均为abcde(输出正确)
  • 集合2:输入abcde、偏移量100,预期输出EFGHI,实际输出芦卢颅庐炉(异常)
  • 集合3:输入Hello World、偏移量3,预期/实际输出均为Khoor#Zruog(输出正确)

问题出在哪?

看你贴的代码,有三个关键错误:

  1. 偏移量取模错误:你写了distance %= 56,但凯撒密码应该针对单个字母表(26个字符)取模,不是把大小写字母凑成56个来算,这会导致偏移量的循环逻辑混乱。
  2. 只处理小写字母的边界:代码只判断了cipherValue > ord('z')的情况,完全没考虑大写字母,也没先判断当前字符是大写还是小写。当偏移量很大时(比如100),小写a的ASCII码是97,97+100=197,远超过z的ASCII码122,你的手动调整逻辑算出来的数值落在了中文编码的范围内,所以输出了汉字乱码。
  3. 边界循环逻辑错误:你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:16:56