当前,我正在编写一个使用Java在给定String上执行ROT-1直到包括ROT-25的程序。在研究的开始,我发现了this代码:
public class Rot13 {
public static void main(String[] args) {
String s = args[0];
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'm') c += 13;
else if (c >= 'A' && c <= 'M') c += 13;
else if (c >= 'n' && c <= 'z') c -= 13;
else if (c >= 'N' && c <= 'Z') c -= 13;
StdOut.print(c);
}
StdOut.println();
}
}
经过一些麻烦的射击后,我明白了这一点:
private static void rotALL(String input) {
//Loop 25 times, starting with ROT-1 and ending at ROT-25 (every possibliity besides the original input)
for (int i = 1; i < 26; i++) {
int rot = 26 - i;
System.out.print("ROT" + rot + ": ");
for (int charIndex = 0; charIndex < input.length(); charIndex++) {
char c = input.charAt(charIndex);
int inta = 97; //a in the ASCII table
int intaWithRot = inta + rot;
int intA = 65; //A in the ASCII table
int intAWithRot = intA + rot;
int intaWithRotPlusOne = intaWithRot + 1;
int intaWithRotPlusi = intaWithRot + i;
int intAWithRotPlusOne = intAWithRot + 1;
int intAWithRotPlusi = intAWithRot + i;
if (c >= inta && c <= intaWithRot) {
c += rot;
} else if (c >= intA && c <= intAWithRot) {
c += rot;
} else if (c >= intaWithRotPlusOne && c <= intaWithRotPlusi) {
c -= rot;
} else if (c >= intAWithRotPlusOne && c <= intAWithRotPlusi) {
c -= rot;
}
System.out.print(c);
}
System.out.println();
}
现在我要解决问题:
当我使用ROT-13输入“ grfg qngn”(即“测试数据”)时,我对ROT-13的输出是“ ROT13:test d {t {”,“ {”和“ a”相距26位彼此在ASCII表中,但是当字母(例如“ e”)正确显示时,我不知道为什么会发生此错误。
如何更改此算法,使其在ROT-1和ROT-25之间循环?我认为这应该可以解决问题,但是我缺少了一些东西。
在此先感谢您的光临!
最佳答案
有数百万种方法可以解决此问题,作为学习者,您应该探索所有这些方法。我对使用模“%”运算符的评论可以通过这种小方法来说明:
private static char rotateLower(char c, int rot) {
int baseBand = c - 'a';
int modified = (baseBand + rot) % 26;
return (char) (modified + 'a');
}
关于java - Java中的ROT-N(或ROT-X)功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46529885/