Java的字母数字凯撒密码

时间:2020-05-15 04:16:45

标签: java caesar-cipher

我正在尝试用Java解决Caesar的Cipher,但是有一个转折。输入的字符串包含字母数字值,我无法解决。到目前为止,这是我尝试过的事情:

  String rotationalCipher(String input, int rotationFactor) {
    // Write your code here
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < input.length(); i++) {
      if(Character.isLowerCase(input.charAt(i))) {
         char ch = (char)(((int)input.charAt(i) + rotationFactor - 97) % 26 + 97); 
      } else if (Character.isUpperCase(input.charAt(i))) {
          char ch = (char)(((int)input.charAt(i) + rotationFactor - 65) % 26 + 65); 
          sb.append(ch); 
      } else {
          char ch = (char)(((int)input.charAt(i) + rotationFactor - 48) % 10 + 48); 
          sb.append(ch); 
      }
    }
      return sb.toString();
  }

我想做的是使用其ASCII值评估每种情况,但我似乎没有获得所需的输出。我使用ASCII错误吗?感谢您的帮助!

Sample input/output:
input = Zebra-493?
rotationFactor = 3
output = Cheud-726?

3 个答案:

答案 0 :(得分:1)

您有两个主要问题。

  • 您没有使用StringBuilder更新append来进行小写转换。
  • 您需要使用isDigit特别处理数字,就像大写和小写字母一样,以便随后可以忽略-和?之类的字符。

一些建议。

  • 在您第一次进入循环时,只需分配ch,然后在整个循环中使用它即可。无需继续输入所有输入内容。
  • 退出ch块时,在结尾附近仅将if/else附加到StringBuilder。
  • 使用“ a”和“ A”代替数字97和65。这样不太可能犯错误。

进行了这些更改之后,您的代码就可以正常工作。

答案 1 :(得分:0)

以下代码对我有用-

  String rotationalCipher(String input, int rotationFactor) {
        // Write your code here
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < input.length(); i++) {
            char x = input.charAt(i);
            if (Character.isLowerCase(x)) {
                char ch = (char) ((x + rotationFactor - 97) % 26 + 97);
                sb.append(ch);
            } else if (Character.isUpperCase(x)) {
                char ch = (char) ((x + rotationFactor - 65) % 26 + 65);
                sb.append(ch);
            } else if (Character.isDigit(x)) {
                char ch = (char) ((x + rotationFactor - 48) % 10 + 48);
                sb.append(ch);
            } else {
                sb.append(x);
            }

        }
        return sb.toString();
    }

答案 2 :(得分:0)

String rotationalCipher(String input, int rotationFactor) {
String output = "";
for(char a: input.toCharArray()){
   if(Character.isAlphabetic(a)){
     char startLetter = Character.isUpperCase(a) ? 'A' : 'a';
     output += (char) ((a- startLetter + rotationFactor) % 26 + startLetter);
   }
  else if(Character.isDigit(a)){
    output += (char) ((a + rotationFactor - 48) % 10 + 48);
   }
  else{
    output += a;
  }
}
return output;}