问题一:这是两个代码微调器。代码A运行错误。但我不知道出了什么问题。
问题二:代码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;
}
答案 0 :(得分: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或找到绝对值,以便它们是正数并产生实际的字母字符。
答案 1 :(得分:0)
'A'以确保“encryptChar”方法的结果是ASCII范围64 to 90
中的有效字符,即{{ 1}}。请参阅ASCII表here。
在您的代码中减去'A'也可以忽略。这也是下面的工作,
A (CAPITAL) to Z (CAPITAL)