java - 我的简单凯撒密码程序(java)只循环字母向前而不是向后

标签 java

我创建了一个程序,它接受一条消息的输入以及要向前或向后循环多少个字母的输入。这一切都有效,只是我不知道如何从 A 向后循环到 Z。例如,每当我尝试从 A 向后循环时,我都会得到一个值,例如 ^。我不知道如何循环回到 Z。这是通过将字符转换为 unicode 值来完成的。我的代码如下:

package caesarcypher;

import java.util.Scanner;

public class CaesarCypher {



    public static void main(String[] args) {


        Scanner sc=new Scanner(System.in);

        int cycle,i,n;

        String message;
        String str1="";
        String str2="";
        System.out.println("Enter the plaintext");
        message=sc.nextLine();
        message=message.toLowerCase();

        n=message.length();

        char ch1[]=message.toCharArray();
        char ch3,ch4;
        System.out.println("Enter the value by which each letter of the string is to be shifted");
        cycle=sc.nextInt();

        System.out.println();
        System.out.println("Encrypted text is");


        for(i=0;i<n;i++)
        {
            if(Character.isLetter(ch1[i]))
            {
                ch3=(char)(((int)ch1[i]+cycle-97)%26+97);
                //System.out.println(ch1[i]+" = "+ch3);
                str1=str1+ch3;
            } 
            else if(ch1[i]==' ')
            {
                str1=str1+ch1[i];
            } 
        }
        System.out.println(str1);

        System.out.println();
        System.out.println("Decrypted text is");



        char ch2[]=str1.toCharArray();
        for(i=0;i<str1.length();i++)
        {
            if(Character.isLetter(ch2[i]))
            {
                if(((int)ch2[i]-cycle)<97)
                {
                    ch4=(char)(((int)ch2[i]-cycle-97+26)%26+97);

                }
                else
                {
                    ch4=(char)(((int)ch2[i]-cycle-97)%26+97);
                }
                str2=str2+ch4;
            } 

            else if(ch2[i]==' ')
            {
                str2=str2+ch2[i];
            } 
        }
        System.out.println(str2);

    }
}

最佳答案

这是因为模运算的工作原理。

(-1) % 26 = -1

所以当你将它添加到 97 时,你仍然在 A 之前。循环返回 1 的示例。

 ('A' + cycle - 97) % 26 + 97
 (97 -1 -97) % 26 + 97
 -1%26 + 97
 -1 + 97. <----- NOT +25

如果它是负数,最简单的解决方案是将 26 添加到 cycle 中,尽管它仍然会在输入 -50 时中断。您似乎已经在解密部分解决了类似的问题。

关于java - 我的简单凯撒密码程序(java)只循环字母向前而不是向后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58986207/

相关文章:

java - 如何配置创建然后移入包中的类

java - 从字符串数组中替换 "["和 "]"的正则表达式是什么?

java - 使用 Apache CXF 时,org.bouncycaSTLe.asn1.x509.SubjectPublicKeyInfo 出现 NoClassDefFoundError

java - 如何在Retrofit2中从HashMap<String, Object>中提取数据?

java - XSS 过滤器以删除所有脚本

java - glfw pollevents() 真的非常慢

java - 两个 Quarkus 服务之间的非阻塞数据流(Vert.x with Mutiny in Java)

java - 在管道中间关闭流

java - 增量求值后 i + i++ + i + i++;

java - 使用 Angular 5(REST Web 服务)生成服务器端 session