1

为了清楚起见,我问这个是因为我已经尝试了大约 1.5 个小时,但似乎没有得到任何结果。我没有上编程课或其他任何东西,但今年夏天我有很多空闲时间,我用很多时间从这本书中学习 Python。我想知道我将如何完成这个问题。

该问题要求您创建一个运行“凯撒密码”的程序,该程序将字符的 ascii 数字向下移动您选择的某个键。例如,如果我想写 sourpuss 并选择键 2,程序会吐出全部向下移动 2 的 ascii 字符。所以 s 会变成 u,o 会变成 q(ascii 字母表中的 2 个字符......)。

我可以通过编写这个程序来获得那部分。

def main():
    the_word=input("What word would you like to encode? ")
    key=eval(input("What is the key? "))
    message=""
    newlist=str.split(the_word)
    the_word1=str.join("",the_word)
    for each_letter in the_word1:
        addition=ord(each_letter)+key
        message=message+chr(addition)
    print(message)
main()

运行这个程序,你会得到以下信息:

What word would you like to encode? sourpuss
What is the key? 2
uqwtrwuu

现在,下一个问题是,如果您将密钥添加到 ascii 数字并导致数字高于 128,则会出现问题。它要求您创建一个实现系统的程序,如果数字高于 128,则字母表会重置,你会回到 0 的 ascii 值。

我试图做的是这样的:

if addition>128:
    addition=addition-128

当我这样做后运行程序时,它不起作用,只是返回了一个空格而不是正确的字符。有任何想法吗?

4

3 回答 3

1

英文字母没有128个字符,所以你不应该用128减去。而且我不知道你为什么认为问题会出现在128上。英文字母最后一个字符的序号是122。合理当您达到 122 时,就会出现问题。

此外,您没有处理大写与小写,但我想这没关系,只要您始终使用小写即可。:-)

你提到这样做是为了“更多角色”。你可以做的是做一个二进制凯撒密码,它不关心你使用的是什么字符,而只是把它看作数字。

def cipher(text, key):
    return [(c + key) % 256 for c in text.encode('utf8')]

def decipher(data, key):
    return bytes([(c - key) % 256 for c in data]).decode('utf8')


if __name__ == "__main__":
    data = cipher("This is a test text. !^äöp%&ł$€", 101)
    print("Cipher data:", data)
    print("Text:", decipher(data, 101))

输出:

Cipher data: [185, 205, 206, 216, 133, 206, 216, 133, 198, 133, 217, 202, 216, 217, 133, 217, 202, 221, 217, 147, 133, 134, 195, 40, 9, 40, 27, 213, 138, 139, 42, 231, 137, 71, 231, 17]
Text: This is a test text. !^äöp%&ł$€
于 2013-08-01T03:01:45.420 回答
1

尝试使用模运算而不是条件:

((ord('z') + 0 - 97) % 26) + 97
=> 122 # chr(122) == 'z'

((ord('z') + 1 - 97) % 26) + 97
=> 97 # chr(97) == 'a'

((ord('z') + 2 - 97) % 26) + 97
=> 98 # chr(98) == 'b'

注意这个表达式:

((ord(character) + i - 97) % 26) + 97

在我们添加偏移量(,如您所说)character ,返回表示给定值的正确整数。特别是,如果我们添加到then 我们将返回. 如果我们添加,那么我们会得到 的代码,依此类推。i0ord('z')'z'1ord('z')a

这适用于 之间的小写字符a-z,幻数是和之间97的代码a26字符数;调整这些数字,您可以调整代码以支持更大范围的字符。az

于 2013-08-01T03:03:15.963 回答
0

尝试将其合并到您的代码中。这将做的是,如果你的凯撒密码的 ascii 数字高于 z 的 ascii 值,那么它将 - 26。例如,如果你的加法变量的值变为 123,程序将减去 26 给你 97给你'a'。如果 ascii 值低于 'a' 的值,这也有效。

if addition > ord("z")
    addition -= 26
elif addition < ord("a"):
    addition+=26
于 2013-10-29T09:33:59.820 回答