2016-10-19 98 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)的 'A'

回答

1

它的ASCII值..字母a的ascii值爲97, A的ascii值爲65.

我希望你能理解ceaser密碼是如何工作的。

,如果你有ABCD你原來的文字和你想要做的1移位申請凱撒密碼,這意味着A將B,B爲C,C是d,d將是E.

長度是您的字符串長度,文本是您的原始文本,轉換是您希望應用ceaser密碼的字母數量。

讓作爲示例文本:ABCD

帶換檔1

現在讓我們假設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') 

希望這是有道理的

3

爲了使%26正確地旋轉編碼字符,當移動將它推到'z'以上時,您需要處理0-25值。 'a' - 'z'的ASCII值是97-122,這使得旋轉困難。通過從被移位的字符中減去'a',將字符映射到0-25的值,使用%26可以進行旋轉。

1

爲「最大漢普頓」之稱,字母從97 ASCII table開始值(在小寫字母的情況下)。因此,如果例如你有字母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 + 'A'= 18+ 97 = 115 ='s'(1回到這裏)

並完成:)