默默地 发表于 2021-11-5 21:14:00

有一段代码不理解

题目
凯撒密码
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:输出加密后的结果字符串。
不理解的代码
ch=((ch-'A')+n)%26+'A';
            if(ch<'A')
                ch=ch+26;
就这一块里面除26取余的作用是什么

jhq999 发表于 2021-11-5 21:55:23

本帖最后由 jhq999 于 2021-11-5 21:56 编辑

把((ch-'A')+n)得到的数值限定在0到25,多了从头再来

jackz007 发表于 2021-11-5 22:16:46

本帖最后由 jackz007 于 2021-11-6 01:04 编辑

         凯撒密码要求输入字母,输出的密文也是字母,
密文 = 明文 + offset
         假如 offset = 8,那么,输入字母 'A' ,密文 = 'A' + 8 ='I',于是,输入明文 'A' ,得到密文 'I',我们知道,英文字母毕竟有限,总共只有 26 个字母,如果明文的 ASCII 编码足够大,加密以后的数值就会超过字符 'Z' 的 ASCII 编码。比如,当明文是 'X' 时,密文 = 'X' + 8 = 88 + 8 = 96,我们知道,'Z' 的ASCII 编码是 90,96 已经比 90 超出了 6,按照规则,这多出来的 6 应该回卷,加到 'A' 上,得到密文 'G'。
      怎么办呢?方法就是修改加密公式,无论明文是什么字母,密文都不会超出字母的正常范围。
密文 = 'A' + (明文 + offset - 'A') % 26
         很显然, 如果
明文 + offset < 'Z'
          则
(明文 + offset - 'A') < 26
          这时,对 26 取余还是这个数本身,加密公式可以直接去掉对 26 取余的操作,于是,加密公式又变回到
密文 = 明文 + offset
         所以,对 26 取余是为了在明文字符 ASCII 编码太大时,让密文字符回卷而设置的,这就是对 26 取余的意义和价值所在。
页: [1]
查看完整版本: 有一段代码不理解