我如何使用模运算来实现凯撒密码

时间:2018-12-21 14:26:45

标签: c modulo

我正在尝试对ASCII字母字符进行换行,以执行从键的转换。例如,如果键为2,则将字母A更改为C。但是,如何使用模数算法环绕Z才能到达B

我正在尝试实现以下公式:

ci = (pi + key) % 26;

其中ci是第i个加密字母,而pi是要加密的第i个字母。

3 个答案:

答案 0 :(得分:2)

我相信您需要使用“相对”值,而不是绝对值。

使用类似

ci = ((pi - 'A' + key) % 26 ) + 'A';

字符整数常量存储编码的值,在这种情况下为ASCII。在这里,'A'从一个偏移量(十进制值65)开始,而不是从0开始。因此,在使用% 26操作对结果进行包装之前,您需要获取抵消了。计算完成后,将偏移量加回去以获取正确的ASCII表示形式。

答案 1 :(得分:2)

其他人已经显示了减去ASCII字母偏移量的基本概念,但是在从大写字母到非大写字母过渡时,您必须要小心,因为我猜想要避免在其中使用一些符号。我添加了一些逻辑,可以使负移位,并将字母保持在大写字母或非大写字母的空间内,并测试它是否是字母。

# Let's suppose that I want the ID: 17J965 and the big data.frame is call `big_df.txt`

 big_df <- read.delim("big_df.txt")
 sample <- grep("17J965", test2a$GATK_Illumina.samples)
 df_sample <- big_df[sample,]

 # df_sample has all the rows containing 17J965, but now I want to create the new data.frame with the extra columns and only select the correct values if there are more IDs 

答案 2 :(得分:0)

更深

 ci = ((pi - 'A' + key) % 26) + 'A';
key为非负数且不太大时,由@Sourav Ghosh回答的

会生成预期的编码A-Z。它将pi减少为- 'A',因此该值在[0...25]范围内,并在%计算后重新偏移。

要在int完整 key范围内工作,需要花费更多的代码。

  • key[INT_MIN...INT_MAX]的等效功能范围缩小[-25 ... 25]范围key % 26。此步骤对于防止int溢出pi - 'A' + key很重要。如果许多字母需要编码,则可以执行一次。

  • 添加26。这确保将负键移到正键。

    ci = ((pi - 'A' + key%26 + 26) % 26 ) + 'A';
    

注意:在C语言中,%不是 mod 运算符,而是 remainder 运算符。当a%b和/或a为负时,b会发生功能差异。 ref