0

問題 1: ここに 2 つのコード スピナーがあります。コード A が間違って実行されます。しかし、何が悪いのかわかりません。

問題 2: コード B は正しいのですが、「A」を削除する必要がある理由がわかりません。次に、fmod の後に「A」を追加します。「A」の効果は?削除後にエラーが発生するのはなぜですか?

コード A (ch + キー) % 26 )

コード B ('A' + ((ch -'A' + キー) % 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

「encryptChar」メソッドの結果が ASCII 範囲の有効な文字であることを確認するために「A」が追加され64 to 90ますA (CAPITAL) to Z (CAPITAL)こちらの ASCII テーブルを参照してください。

あなたのコードでは、 「A」の減算も無視できます。つまり、以下も機能します。

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