凯撒密码问题

时间:2019-11-01 06:31:00

标签: python

我已经创建了代码,并将其输入到输出中。对于检查输入,我有2/3次运行正确,但是当我输入时我缺少输出的一部分
'你好,世界!'

一切运行正常。

    plainText = input("Enter a message: ")
    distance = int(input("Enter the distance value: "))
    code = ""
    for ch in plainText:
        ordvalue = ord(ch)
        cipherValue = ordvalue + distance
        if cipherValue > ord ('z'):
            cipherValue = ord('a') + distance - (ord('z') - ordvalue + 1)
        code = code + chr(cipherValue)
    print(code)

加密的输出应该是Lipps${svph%,但是我得到Lipps$asvph%。只是想在这里找到我所缺少的。

3 个答案:

答案 0 :(得分:0)

凯撒密码只能更改a..z范围内的字符。其他所有字符均保持不变。您的代码中缺少此限制。

if 'a' <= ch <= 'z':
    cipherValue = ...
else:
    cipherValue = ch

> ord('z')的情况下,您可以使代码更加简单:

cipherValue -= 26

或者,如果您不想写数字26,而是解释一下:

cipherValue -= 1 + ord('z') - ord('a')

答案 1 :(得分:0)

您希望'w'(来自'Hello world!')应转换为'{'-而不是'a'。但是,事实并非如此。

从您的示例可以推断出distance4'H'成为'L'。然后,根据您的算法,'w'将必然变为'a'ord('w') + 4等于ord('z') + 1,因为ord('w') == ord('z') - 3。因此,将执行if语句的子句。如果通过将ordvalue替换为ord('z') - 3来计算结果,则会看到结果为ord('a')

由于如注释中所述,您希望使代码将字符串'Hello World!'转换为'Lipps${svph%',您可能只需要消除代码中“重叠”部分处理,即消除处理cipherValue > ord ('z')情况的代码。

答案 2 :(得分:0)

对于那些想知道的人-这是一个语言问题。代替“ a”和“ z”,它必须是“〜”。

希望这对以后的人有所帮助。