我不明白为什么这个代码对“p”之后的任何字母都有效,但它确实有效,因为我们使用了%
alphabet = "abcdefghijklmnopqrstuvwxyz"
punctuation = ".,?'! "
message = "xuo jxuhu! jxyi yi qd unqcfbu ev q squiqh syfxuh. muhu oek qrbu je tusetu yj? y xefu ie! iudt cu q cuiiqwu rqsa myjx jxu iqcu evviuj!"
translated_message = ""
for letter in message:
if not letter in punctuation:
letter_value = alphabet.find(letter)
translated_message += alphabet[(letter_value + 10) % 26]
else:
translated_message += letter
print(translated_message)
任何大于15的字母索引将生成大于或等于26的相应索引(+10)。模运算符(
%
)将使索引返回到26以下(基本上在26个字母内环绕)模是整数除法的余数。例如,如果原始字母在索引19处,那么你将用29除以26,得到1的商和3的余数。这将为您提供字母[3]作为相应的字母值<;而不是0
简言之,模26的任何数字将产生小于26且大于零的值(在字母表的指数化范围内)
请注意,程序不需要检查标点符号,.find()函数将返回-1,如果它在字母表中找不到字母,那么您可以检查字母_值>;=0来执行转换
此外,考虑到偏移量小于26,您可以简单地将字母字符串加倍,并避免完全使用模:
如果以后您想反转翻译,可以反转字母表并按原样使用其余代码
凯撒密码是一个非常好的密码。它计算出前15个字母等于
letter_position + 10
。但是我完全理解你在使用%
符号时的困惑但让我来解释一下数学:
对于前15个字母,对应的字母是其在字母表中的位置加上10个点。让我们以字母
i
为例这就是
%
的作用所在。 尽管将其放入计算器,您会发现结果除法18 / 26
的结果是一个小数字,小于1这是使用模规则之一的地方:
这意味着对于所有小于16的数字(当加上10时小于26),它在字母表中的位置相同
现在对于代码中
p
之后的任何字母: 模计算实际上非常简单让我们以字母
w
为例要找到32的mod 26,从32中减去26,直到得到的数字小于0(等于零就可以了)。剩下多少是你的模方程的答案
如果您想更轻松地编写自己的消息,我使用python制作了一个快速字典
相关问题 更多 >
编程相关推荐