2 ingqi INGQI 于 2013.03.07 01:17 提问

字符串加密排序问题(char) (ch + key) % 26 )错误在何处?为什么要加上'A'

谢谢各位,这段代码正负数KEY和运算方式我都明白,唯一不明白的是'A'的作用。
问题一:下面有两段代码,其中代码A运行时是错的,但我不明白错误在何处。
问题二:代码B是正确的,但我不明白为什么需要先减去'A',然后求余数之后再加上'A'.这个'A'是什么作用?为什么删除之后就运行出错呢(问题一)?
Code A (ch + key) % 26 )
Code B ('A' + ((ch -'A' + key) % 26))

     public void run() {    
        setFont("Arial-PLAIN-24");
        String line = readLine ("Enter line: ");
        int key = readInt ("Enter key: ");
        String siphertext = encryptCaesar(line , key);
        println("The result is: " + siphertext);
        String newplain = encryptCaesar(siphertext , -key);
        println("newplain:" + newplain);    
    }

    private String encryptCaesar(String str , int key){
        if(key < 0){
            key = 26 - ( -key % 26 );
        }

        String result = "";
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);        
            result += encryptChar(ch,key);
        }
        return result;
    }

    private char encryptChar(char ch, int key){
        if(Character.isUpperCase(ch)){
            return ( (char) ('A' + ((ch -'A' + key) % 26)) );
        }
        return ch;
    }

4个回答

INGQI
INGQI   2013.03.11 17:01
已采纳

自问自答

A-Z并不对应十进制的1-26,而是对应十进制中的65-90。所以ch需要减去65也就是'A',才能准确的求出余数。

栗子:假设 key = 2; ch = ‘B’;
’B'的数字不是2,是66。CODE[A]的计算必然不正确。

’A‘ + ('B' - ‘A' + key)% 26 即 65 + (66 - 65 + 2) % 26

('B'' + key)% 26 即 (66 + 2) % 26

xiaoyan_12
xiaoyan_12   2013.03.07 14:11

添加'A'是确保"encryptChar" 方法的结果在 ASCII 范围64 to 90(A (CAPITAL) to Z (CAPITAL))是一个有效的字符。请参考 ASCII 表

在你的代码中减去'A'也可以忽略,('A' + ((ch + key) % 26))也会运行。

qq_16643231
qq_16643231 保证代数式范围
接近 3 年之前 回复
INGQI
INGQI 感谢!您太厉害了!我问了很多人都说不出明白。
接近 5 年之前 回复
O_Casper_ne
O_Casper_ne   2013.03.07 15:04
int e = (-5)%3; // -2
int f = (-5)/3; // -1
System.out.println("(-5)%3 produces " + e +
                   " (note that (-5)/3 produces " + f + ")");

如果((ch -'A' + key) % 26))的结果是负数的话,(char) ('A' + ((ch -'A' + key) % 26))的结果难道不会变成一些非字母字符?或许你可以给这些负数加26,或者取负数的绝对值,这样的话 你就能得到正数,并且结果就是正常的字符了。

INGQI
INGQI 不是负数的问题,有专门处理负数的代码 if(key < 0){ key = 26 - ( -key % 26 );}。
接近 5 年之前 回复
Baby_Bonnie
Baby_Bonnie   2013.03.07 15:14

Code B是说字符和数字的映射关系:
[40..90]代表的就是ASCII码里面的[')'..'A'..'Z']
Code A 说字符和[-25..25]的对应关系

INGQI
INGQI 似懂非懂,能浅显一点吗?
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!