尝试在 java 中实施凯撒密码
Trying to implement a caesar cipher in java
我正在尝试在 java 中实施凯撒密码加密,但是如果必须进行轮换,我会得到错误的输出,例如 key=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);
}
}
}
您的模数计算有误。应该是:
k = k % 26; // not 26%k as you currently have
或者,更优雅地:
k %= 26;
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;
}
}
我将它缩小到每当它结束时,它没有正确环绕。试一试,它应该会起作用,至少对于我正在尝试的是这样。
此外,在您使用 in.nextInt() 获得 k 的输入后,我会检查它是否在 26 以上,然后 mod 它。它根本不会影响答案,在我看来只是更干净。
int k = in.nextInt();
if(k > 26)
k%=26;
我正在尝试在 java 中实施凯撒密码加密,但是如果必须进行轮换,我会得到错误的输出,例如 key=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);
}
}
}
您的模数计算有误。应该是:
k = k % 26; // not 26%k as you currently have
或者,更优雅地:
k %= 26;
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;
}
}
我将它缩小到每当它结束时,它没有正确环绕。试一试,它应该会起作用,至少对于我正在尝试的是这样。
此外,在您使用 in.nextInt() 获得 k 的输入后,我会检查它是否在 26 以上,然后 mod 它。它根本不会影响答案,在我看来只是更干净。
int k = in.nextInt();
if(k > 26)
k%=26;