当前位置: 首页 > 知识库问答 >
问题:

凯撒密码,每个字母移动不同的值?

班宏毅
2023-03-14
def getdigit(number, n):
    return int(number) // 10**n % 10

message = "helloworld"
key = "0123456789"
alphabet = "abcdefghijklmnopqrstuvwxyz"
encoded = "".join([alphabet[(alphabet.find(char)+getdigit(key, char))%26] for char in message])
print(encoded)
Traceback (most recent call last):
  File "c:\users\ants\mu_code\blank.py", line 7, in <module>
    encoded = "".join([alphabet[(alphabet.find(char)+getdigit(key, char))%26] for char in message])
  File "c:\users\ants\mu_code\blank.py", line 7, in <listcomp>
    encoded = "".join([alphabet[(alphabet.find(char)+getdigit(key, char))%26] for char in message])
  File "c:\users\ants\mu_code\blank.py", line 2, in getdigit
    return int(number) // 10**n % 10
TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'str'

共有1个答案

仲孙铭
2023-03-14

您的代码有一个类型错误,因为您将getDigit函数定义为将number作为字符串,并将n作为整数,但随后您调用了类似于getDigit(key,char)的函数,其中key是一个字符串,char也是一个字符串--它是message中的一个字母,因为它来自message中的char

要直接修复这个问题并不简单,因为n应该是messagechar出现的索引,但是您的代码不知道该索引,并且您不能使用message.index(char)方法查找它,因为它给出的是char第一次出现的索引,而不是当前出现的索引。enumerate函数可用于访问列表理解中的索引。

也就是说,以不需要索引的方式编写代码会简单得多。您可以通过使用zipmessage中的字母与key中的相应数字配对来简化代码。这看起来像是一个家庭作业任务,所以我不会给出完整的解决方案,但以下内容可能会给您一个如何完成它的想法:

>>> message = "helloworld"
>>> key = "0123456789"
>>> for char, digit in zip(message, key):
...     print('char:', char, 'digit:', digit)
... 
char: h digit: 0
char: e digit: 1
char: l digit: 2
char: l digit: 3
char: o digit: 4
char: w digit: 5
char: o digit: 6
char: r digit: 7
char: l digit: 8
char: d digit: 9
 类似资料:
  • 基本上,我必须创建一个凯撒密码,它只是用一个int'k'以外的字母替换给出的每个字母。这需要2个命令行参数:“./caesar”和“k”,它们由用户提供。它工作得很好;但有一个问题: 它将“Barfoo”加密为“Eduirr”,使用3作为正确的密钥;将“Barfoo”加密为“Fevjss”,使用4作为正确的密钥 但是它不是用65作为密钥将“barfoo”加密为“onesbb”,而是将其加密为“oo

  • 因此,目前我的凯撒密码程序运行良好,每当我使用小写字母。但是,当我用大写输入一个单词或短语时,我想让它工作。这是我现在有的代码。希望你们能帮我完成这件事。 def encrypt(消息,距离):“”将获取消息并将其旋转到距离,以创建加密消息“” def decrypt(消息,距离):“”“将解密上面的消息”“” def binaryConversion(消息):“”“将把单词转换成二进制代码”“

  • 我目前正在写一个凯撒密码程序在C#为我的任务,我有一个问题。 我使用一个数组来完成这个任务,在这个数组中,我存储了整个字母表,并声明了一个由数组中的字符索引定义的移位变量--这是一个for循环的迭代。移位计算在foreach循环中完成,该循环从文本文件中读取的字符串中提取字符。Foreach循环包含在for循环中,该循环迭代输出每个可能的移位。 然而,问题是,当我试图通过shift变量的值访问数组

  • 当前方案: 我确实得到了输出,但有一些加密错误。问题是,由于代码行在彼此后面运行,已经转换的字母会再次转换。 例如:字母“A”被加密/转换为“R”。当程序到达字母“R”时,该字母再次被加密/转换,最终变成“X”,在代码的后面被转换为“U”。这几乎发生在每封信,然后我最终得到一个加密的文本,我永远无法解密。 有什么方法可以同时替换所有的字母,或者你会简单地建议我使用另一个函数吗?

  • 我需要编写一个python、hacker和wow这些单词的加密文本,并且使用不包括使用RAW_INPUT的python中的凯撒密码,距离为3。这是我到目前为止,但我不断得到一个错误消息,我不知道如何修复它。

  • 问题内容: 我通过java进行了凯撒密码,它可以运行,但是在用户输入密钥后不对任何内容进行加密! 这是我的代码 跑: 问题答案: 使用效率不是很高…您可以对值进行整数运算以获得其索引。 我在代码中添加了注释以解释更多信息,但这就是我想出的。 输出应该是这样的