2016-10-19 13 views
0

ここではJavaコードがシーザーの暗号シーザーの暗号

import java.util.*; 

public class Main { 

public static void main(String[] args) { 
    Scanner stdin = new Scanner(System.in); 
    int length = stdin.nextInt(); 
    String text = stdin.next(); 
    int shift = stdin.nextInt(); 

    for(int i = 0; i < length; i++) { 
     char c = text.charAt(i); 
     if(c >= 'a' && c <= 'z') { 
      System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a')); 
     } else if(c >= 'A' && c <= 'Z') { 
      System.out.print((char)(((int)c - (int)'A' + shift) % 26 + (int)'A')); 
     } else { 
      System.out.print(c); 
     } 
    } 
    stdin.close(); 
} 
} 

のためだと私はコード

System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a')); 

なぜやるのこのラインで何が起こっているか理解できない - (int)を「」

答えて

1

これはASCII値です..文字aはASCII値97、 Aはascii値が65です。

私はあなたがceaser暗号の仕組みを理解してくれることを願っています。

元のテキストとしてABCDがあり、シーザー暗号を適用するには1をシフトすると、AはB、BはC、CはD、DはEになります。

lengthは文字列の長さ、textは元のテキスト、shiftはceaser暗号を適用するアルファベットのシフト数です。

サンプルテキストを取ることができます:今のシフト1

とABCD

は、cの値を取ることができますが ''

あるので、この文は(int)c - (int)'a' + shift) % 26 + (int)'a')

通常行います(97あります-97 + 1)%26 + 97

(1%26)+97 
1+97 
98 

これはascii e bの二価。あなたのコードで全体の操作が終わりにchar型に変換された理由は以下のとおりです。

**(char)**(((int)c - (int)'a' + shift) % 26 + (int)'a') 

は97からASCII table着工の文字の値は、「マックス・ハンプトンが」言ったように、それは意味

3

シフトが 'z'を超えてエンコードされた文字を正しく回転させるには、0-25の値を扱う必要があります。 'a' - 'z'のASCII値は97-122であり、回転を困難にします。シフトされている文字から 'a'を減算することによって、文字を0〜25の値にマッピングし、%26を使用して回転を可能にします。

1

を行いホープ(小文字の場合)。

したがって、たとえばc='p'の場合はc = 112、 'a' = 97なので 'p' - 'a' = 112-97 = 15(注:pはアルファベットの16桁です)。

ここでシフトを追加します(ただし、pは1ステップ後退しましたが、すぐに修正します)。シフトが3であることができます(私たちが望むのp> s)は今

たちだ15 + 3 = 18 18%26修正のための今= 18

:18 + '' = 18+ 97 = 115 = 's'(ここに1が戻ってきます)

完了:

関連する問題