凯撒密码 - 我哪里出错了?
Caesar's cipher - where am I going wrong?
我已经编写了这个简单的程序,其中包括一种用于对消息进行编码的方法(凯撒密码)...虽然不起作用,但我认为这与我的 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);
}
}
当您查找(第二个 for 循环)字母并找到它时,您必须退出 bucle 以避免重复替换。
例如,如果输入字符串是 "A" 并且 k = 2:
您在 alpha 中寻找字母 A 并将其更改为字母 C。随着 bucle 继续迭代 alpha,您找到 C 并将其更改为 E. 等等
打个断点,一步步执行。
虽然您的实施 可以 提供正确的偏移量,但您可以尝试一些更简单的方法。
您只需要知道一个字符可以解释为一个整数,中间没有任何黑魔法。
char x = 'A';
System.out.println((int) x); //65
利用这一优势,我们可以像这样实现 caesar:
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);
}
我已经编写了这个简单的程序,其中包括一种用于对消息进行编码的方法(凯撒密码)...虽然不起作用,但我认为这与我的 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);
}
}
当您查找(第二个 for 循环)字母并找到它时,您必须退出 bucle 以避免重复替换。
例如,如果输入字符串是 "A" 并且 k = 2:
您在 alpha 中寻找字母 A 并将其更改为字母 C。随着 bucle 继续迭代 alpha,您找到 C 并将其更改为 E. 等等
打个断点,一步步执行。
虽然您的实施 可以 提供正确的偏移量,但您可以尝试一些更简单的方法。
您只需要知道一个字符可以解释为一个整数,中间没有任何黑魔法。
char x = 'A';
System.out.println((int) x); //65
利用这一优势,我们可以像这样实现 caesar:
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);
}