0

问题一:这里有两个代码微调器。代码 A 运行错误。但我不知道出了什么问题。

问题二:代码B是对的。但我不明白为什么需要删除'A'。然后在 fmod 之后添加“A”。“A”的作用是什么?为什么删除后有错误?

代码 A (ch + key) % 26 )

代码 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

2 回答 2

0

15.7.3 余数运算符 %

...从这个规则可以看出,只有当被除数为负时,余数运算的结果才能为负,只有当被除数为正时才能为正。

然后提供了一个示例:

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 添加到任何负值或找到绝对值,以便它们为正值并产生实际的字母字符。

于 2013-03-07T02:33:45.647 回答
0

添加'A'以确保“encryptChar”方法的结果是ASCII范围内的有效字符64 to 90,即A (CAPITAL) to Z (CAPITAL). 请参阅此处的 ASCII 表。

在您的代码中减去“A”也可以忽略。那就是下面也可以工作,

('A' + ((ch + key) % 26))
于 2013-03-07T02:45:16.827 回答