2017-04-27 59 views
0

我已经写了一个凯撒密码的代码,其中第一个输入是没有任何空格的字符串的长度,第二个输入是要旋转的字符串&第三个是旋转的关键。我的代码正在工作,除了字符串的最后一个字符。为此,一些奇怪的角色来了,而不是字母表。请帮助!!! ..我在我的智慧结束..只是无法弄清楚!下面是代码: -最后一个字符旋转不正确

import java.io.*; 
    import java.util.*; 
    public class Solution { 
    public static void main(String[] args) { 
    int length,rotate,i,x; 
    Scanner scan=new Scanner(System.in); 
    String s; 
    length=scan.nextInt(); 
    s=scan.next(); 
    rotate=scan.nextInt(); 
    char c[]=s.toCharArray(); 
    for(i=0;i<length;i++) { 
    x=c[i]; 
    if(((x>65)||(x==65))&&((x==90)||(x<90))) { 
    x=x+rotate; 
    if(x>90) 
    x=x-90; 
    } 
    else if(((x>97)||(x==97))&&((x==122)||(x<122))) { 
    x=x+rotate; 
    if(x>122) 
    x=x-122; 
    } 
    c[i]=(char)x; 
    } 
    System.out.println(); 
    for(i=0;i<length;i++) 
    System.out.print(c[i]); 
    } 
    } 

输入: -

11 
    middle-Outz 
    2 

输出应该是: -

okffng-Qwvb 

而是我的输出如来: -

okffng-Qwv 

请大家帮忙!!!请...有人告诉我的代码中有什么错误!

+1

请在发布之前花时间格式化您的代码。 –

回答

0

您目前没有任何逻辑来处理如果旋转位移超过某个特定值时字母绕到字母表开头的情况。您的逻辑应该是将基本值(即第一个字母)加上初始移位的剩余部分加上旋转量除以字母的大小。类似这样的:

public static void main(String[] args) { 
    int length, rotate, i, x; 
    Scanner scan = new Scanner(System.in); 
    String s; 
    // don't input the length of the array, let it tell you what its length is 
    //length = Integer.parseInt(scan.nextLine()); 
    s = scan.nextLine(); 
    // make sure you really enter a pure integer here, to avoid a crash 
    rotate = Integer.parseInt(scan.nextLine()); 
    char c[] = s.toCharArray(); 
    for (i=0; i < c.length; i++) { 
     x = c[i]; 
     int base; 
     if (x >= 65 && x <= 90) { 
      base = 65; 
     } 
     else if (x >= 97 && x <= 122) { 
      base = 97; 
     } 
     else { 
      continue; 
     } 
     int diff = x - base; 
     x = base + (rotate + diff) % 26; 
     c[i] = (char)x; 
    } 
    System.out.println(); 
    for (i=0; i < c.length; i++) 
     System.out.print(c[i]); 
} 

请注意,我选择不修改不是小写或大写英文字母的字符。在其他角色的情况下,他们不会被旋转。

请按照以下链接进行演示,演示显示输入middle-Outz正确转换为okffng-Qwvb

Rextester

更新:

正如你正确地指出的那样,你也有一些问题,你Scanner逻辑。一种安全模式,用于总是读取字符串行中的所有内容,然后根据需要解析/格式化输入。您得到的输入不匹配异常可能是由于扫描仪使用不正确。

+0

此代码是完美的,但我有一些疑虑..如果他们被清除,将不胜感激。 – Priya

+0

@Priya让我知道你的问题,我可以尝试清除它们。 –

+0

(1)我第一次发布的代码给了我netbeans中的输入不匹配异常......请问为什么? (2)如果它的书写代码不是字母表,那么基本整数在发生什么? (3).length()函数在没有方括号()的情况下工作.....所以在任何地方工作或只需要for循环()不是必需的?对于像toCharArray,toUpperCase等其他Java函数是否有效? – Priya