2016-05-20 13 views
0

Ich versuche, eine Caesar-Verschlüsselung in Java zu implementieren, aber ich bekomme falsche Ausgabe, wenn eine Drehung getan werden soll, dh zum Beispiel Schlüssel = 2 und Text ist "ZZ" die Ausgabe sollte "bb" sein. Ich weiß nicht, wo ich falsch im Code unten bin.Versuchen, eine Caesar-Chiffre in Java zu implementieren

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class Solution { 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     int n = in.nextInt();// length of the string 
     String s = in.next();// The string to be encrypted using caesar cipher 
     int k = in.nextInt();// The key k 
     int key; 
     for(int i =0;i<n;i++){ 
      int ascii = (int)s.charAt(i); 
      if(s.charAt(i)=='-'){ 
       System.out.print('-'); 
       continue; 
      } 
      if(ascii >= 65 && ascii <=90){ 
       if(k+ascii > 90){ 
        k=k%26; 
        if(k==0){ 
         k+=1; 
        } 

        ascii=64+k; 
       } 
       else{ 
        ascii=ascii+k; 
       } 
      } 
      if(ascii >= 97 && ascii <=122){ 
       if(k+ascii > 122){ 
        k=k%26; 
        if(k==0){ 
         k+=1; 
        } 

        ascii=96+k; 
       } 
       else{ 
        ascii=ascii+k; 
       } 
      } 
      char c=(char)ascii; 
      System.out.print(c); 
     } 
    } 
} 

Antwort

0
   if(ascii >= 65 && ascii <=90){ 
        k%=26; 
        if(k+ascii > 90){ 
         ascii = (ascii + k - 90)+64; //This is what it should be 
        } 
        else{ 
         ascii=ascii+k; 
        } 
       } 
       if(ascii >= 97 && ascii <=122){ 
        k%=26; 
        if(k+ascii > 122){ 
         ascii = (ascii + k - 122)+96; //This is what it should be 
        } 
        else{ 
         ascii=ascii+k; 
        } 
       } 

Ich verengte es auf, wann immer es geht über das Ende, es wurde nicht richtig Umwickeln. Gib das eine Chance und es sollte funktionieren, zumindest für das, was ich versucht habe.

Auch, nachdem Sie Eingabe für k mit in.nextInt() erhalten, würde ich nur überprüfen, ob es über 26 ist direkt dort und mod es. Es wird die Antwort überhaupt nicht beeinflussen und ist meiner Meinung nach nur sauberer.

int k = in.nextInt(); 
if(k > 26) 
    k%=26; 
+0

Danke funktioniert wie ein Zauber, dachte an die gleiche Sache, war aber ein bisschen verwirrt. –

3

Ihre Modulo-Berechnung ist falsch. Es sollte sein:

k = k % 26; // not 26%k as you currently have 

Oder eleganter:

k %= 26; 
+0

Danke für das Hinweisen, aber in einigen Fällen funktioniert dieser Code nicht. –