我怎么会在字母表中循环?

时间:2013-11-27 15:10:53

标签: java

这比我想象的要复杂一点。

我正在创建一个加密的java程序:

输入为'a'并将字母移动5,转到'f'

这是简单的ASCII,但当我到达字母z时,我希望程序循环回到'a'并重新开始,如果这有意义,我不知道从哪里开始!

4 个答案:

答案 0 :(得分:3)

关键是模数除法:

char c;
c = (char)((c - 'a' + 5) % 26 + 'a');

c - 'a'会为您提供字母0-25的编号,然后将其向上移动5,将除以26后的余数添加到'a'以提供回到信中的角色。

答案 1 :(得分:3)

使用mod %运算符。

char translated = (char) ('a' +  (charOriginal -'a' + 5) % ('z' - 'a' + 1));

答案 2 :(得分:1)

这是:

public char encrypt(char c)
{
    return Character.isLowerCase(c) ? (char)((c - 'a' + 5) % 26 + 'a') : (char)((c - 'A' + 5) % 26 + 'A');
}

我编辑了我的帖子,现在检查大小写。

如果你没有,减去'a'表示大写,它将无效。例如,加密('Y')将返回'^'而不是'D'。

答案 3 :(得分:0)

您可以尝试这样的事情:

/**
 * Shifts a letter 5 letters, if the char is a letter,
 * other wise (if a number or symbol) just returns the char.
 * Jumps back to 'a' or 'A' when it goes past 'z' or 'Z'.
 */
public char shift5(char letter) {
    char letterToReturn = letter;
    if(letterToReturn >= 'a' && letter <= 'z') {
        // letter is lowercase
        letterToReturn = shiftLetter(letterToReturn , 5);
    } else if(letter >= 'A' && letter <= 'Z') {
        // letter is uppercase
        letterToReturn = shiftLetter(letterToReturn , 5);
    }
    return letterToReturn;
}

/**
 * Shifts a letter to the next letter the specified amount of times.
 * Jumps back to 'a' or 'A' when it goes past 'z' or 'Z'.
 */
public char shiftLetter(char letter, int amountToShift) {
    char letterToReturn = letter;
    for (int i = 1; i <= amountToShift; i++) {
        letterToReturn ++;
        if(letterToReturn == (char)((int)'z' + 1) {
            // letter has gone past 'z', so change to 'a'
            letterToReturn = 'a'
        } else if(letterToReturn == (char)((int)'Z' + 1) {
            // letter has gone past 'Z', so change to 'A'
            letterToReturn = 'A'
        }
    }
    return letterToReturn;           
}

此代码处理小写,大写和非字母的字符。