凯撒的密码 - 我哪里错了?

时间:2015-12-15 12:59:11

标签: java caesar-cipher

我写过这个简单的程序,包括一个编码消息的方法(Caesar的密码)...虽然不起作用,但我认为它与我的if条件有关,因为字母会偏离'Z' '(因此重置到字母表的开头)。

我在网上找到了凯撒密码的其他代码,它使用了StringBuilders和我还没有学过的其他方法。这很棒,我期待有一天能到达那里,但与此同时,我的代码出了什么问题?

无需给我答案,但我会非常感激提示。 :)

 import java.util.*;
 class Exercice4 {

public static void main(String[] args) {

     Scanner sc = new Scanner(System.in);

     System.out.println("Enter a message:");
     String msg = (sc.nextLine()).toUpperCase();

     System.out.println("Enter a value for K:");
     int k = sc.nextInt();

     caesar(msg, k);


}

 public static void caesar(String A, int B) {

     char str[]=A.toCharArray();
     String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     for (int i=0; i<A.length(); i++) {
         for (int j=0; j<26; j++) {
             if (alpha.charAt(j) == str[i]) {
                 if ((j+B)>25) {
                     str[i] = alpha.charAt(j + B - 26);
                 } else {
                     str[i] = alpha.charAt(j + B);
                 }
             }
         }  
     }
     String code = new String (str);
     System.out.println("Here is your encoded message: ");
     System.out.println(A);
     System.out.println(code);
 }
} 

2 个答案:

答案 0 :(得分:3)

当你查找(第二个for-loop)一个字母并找到它时,你必须退出该字母以避免重复这些内容。

例如,如果输入字符串是“A”且k = 2:

你在字母A中寻找字母A并用字母C改变它。当bucle继续迭代alpha时你会发现C并用E.等改变它。

放置断点并逐步执行。

答案 1 :(得分:-1)

虽然您的实现可以在给定正确的偏移数字的情况下工作,但您可以尝试一些更简单的方法。

你需要知道的是,一个角色可以被解释为一个整数,中间没有任何黑魔法。

char x = 'A'; 
System.out.println((int) x); //65

利用这个我们的优势,我们可以像这样实施凯撒:

public static String caesar(String A, int B) {
    char[] newString = A.toCharArray();
    for(int i = 0; i < A.length(); i++){
        int newChar = newString[i]+B;
        while(newChar > 65+26) // 65 = A, 26 = number of letters in the alphabet
            newChar -= 26;

        newString[i] = (char) (newChar);

    }
    return new String(newString);
}