这比我想象的要复杂一点。
我正在创建一个加密的java程序:
输入为'a'并将字母移动5,转到'f'
这是简单的ASCII,但当我到达字母z时,我希望程序循环回到'a'并重新开始,如果这有意义,我不知道从哪里开始!
答案 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;
}
此代码处理小写,大写和非字母的字符。