当前,我正在编写一个使用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/

10-10 15:10