Попытка реализовать шифр Цезаря в Java

Я пытаюсь реализовать шифрование шифра Цезаря в java, но я получаю неправильный вывод, если необходимо выполнить вращение, например, ключ = 2, а текст «zz», вывод должен быть «bb». Я не знаю, где я ошибаюсь в коде ниже.

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);
        }
    }
}

person Shubam Singh Jamwal    schedule 20.05.2016    source источник


Ответы (2)


               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;
                    }
                }

Я сузил его до того, что всякий раз, когда он выходит за край, он не закручивался правильно. Попробуйте, и это должно сработать, по крайней мере, для того, что я пытался.

Кроме того, после того, как вы получите ввод для k с помощью in.nextInt(), я просто проверю, выше ли оно 26, и модифицирую его. Это никак не повлияет на ответ и, на мой взгляд, просто чище.

int k = in.nextInt();
if(k > 26)
   k%=26;
person Orin    schedule 20.05.2016
comment
Спасибо, сработало как шарм, думал о том же, но немного смутился. - person Shubam Singh Jamwal; 21.05.2016

Ваш расчет по модулю неверен. Так должно быть:

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

Или, более элегантно:

k %= 26;
person Mureinik    schedule 20.05.2016
comment
Спасибо за указание, но в некоторых случаях этот код не работает. - person Shubam Singh Jamwal; 20.05.2016