凯撒的密码
Ceaser's Cipher
这是 Ceaser 密码的 Java 代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
int length = stdin.nextInt();
String text = stdin.next();
int shift = stdin.nextInt();
for(int i = 0; i < length; i++) {
char c = text.charAt(i);
if(c >= 'a' && c <= 'z') {
System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a'));
} else if(c >= 'A' && c <= 'Z') {
System.out.print((char)(((int)c - (int)'A' + shift) % 26 + (int)'A'));
} else {
System.out.print(c);
}
}
stdin.close();
}
}
我不明白这行代码发生了什么
System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a'));
为什么 -( int ) ' a '
为了使 % 26 在移位将编码字符推到 'z' 之外时正确旋转编码字符,您需要处理值 0-25。 'a' - 'z' 的 ASCII 值是 97-122,使得旋转变得困难。通过从被移动的字符中减去 'a',您将字符映射到 0-25 之间的值,从而可以使用 %26.
进行旋转
它的 ASCII 值。字母 a 的 ascii 值为 97,A 的 ascii 值为 65。
我希望你了解塞塞密码的工作原理。
如果你的原文是ABCD,你想做1的移位来应用ceaser密码,这意味着A将是B,B将是C,C将是D,D将是E。
length 是您的字符串长度,text 是您的原始文本,shift 是您要应用 ceaser 密码的字母表的移位次数。
让我们来看一个示例文本:abcd
第 1 班
现在假设 c 值为 'a'
所以这个语句是(int)c - (int)'a' + shift) % 26 + (int)'a')
通常会做 (97-97+1)%26+97
(1%26)+97
1+97
98
这是 b 的 ascii 等价物。这就是为什么在你的代码中整个操作在最后转换为 char:
**(char)**(((int)c - (int)'a' + shift) % 26 + (int)'a')
希望它有意义
如"Max Hampton"所说,ASCII table中字母的取值从97开始(小写字母)。
因此,例如,如果您有字母 c='p'
,则 c = 112。还有 'a'=97,因此 'p'-'a' = 112-97 = 15(注意:p 是字母表中的第 16 位)。
现在我们添加移位(虽然 p 现在向后移动了 1 步,但我们稍后会修复它)。让移位为 3(我们想要 p->s)
现在我们得到 15+3 = 18。18%26 = 18。
现在进行修复:18 + 'a' = 18+97 = 115 = 's'(1 又回来了)
完成:)
#include<iostream>
#include<string>
using namespace std;
int Ceasers_Cipher()
{
int y;
string x;
int r;
cout << "enter any sentence" << endl;
getline(cin, x);
y = x.size();
cout << "enter rotation" << endl;
cin >> r;
for (int i = 0; i < y; i++)
{
if (x[i] >= 'a' && x[i] <= 'a'+(26-r))
{
x[i] += r;
}
else if (x[i] >= 'a' + (26 - r)+1 && x[i] <= 'z')
{
x[i] -= 26-r;
}
else if (x[i] >= 'A' && x[i] <= 'A' + (26 - r))
{
x[i] +=r;
}
else if (x[i]>='A' + (26 - r) + 1 && x[i] <= 'Z')
{
x[i] -= 26-r;
}
}
cout << x << endl;
return 0;
}
int main()
{
Ceasers_Cipher();
}
这是 Ceaser 密码的 Java 代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
int length = stdin.nextInt();
String text = stdin.next();
int shift = stdin.nextInt();
for(int i = 0; i < length; i++) {
char c = text.charAt(i);
if(c >= 'a' && c <= 'z') {
System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a'));
} else if(c >= 'A' && c <= 'Z') {
System.out.print((char)(((int)c - (int)'A' + shift) % 26 + (int)'A'));
} else {
System.out.print(c);
}
}
stdin.close();
}
}
我不明白这行代码发生了什么
System.out.print((char)(((int)c - (int)'a' + shift) % 26 + (int)'a'));
为什么 -( int ) ' a '
为了使 % 26 在移位将编码字符推到 'z' 之外时正确旋转编码字符,您需要处理值 0-25。 'a' - 'z' 的 ASCII 值是 97-122,使得旋转变得困难。通过从被移动的字符中减去 'a',您将字符映射到 0-25 之间的值,从而可以使用 %26.
进行旋转它的 ASCII 值。字母 a 的 ascii 值为 97,A 的 ascii 值为 65。
我希望你了解塞塞密码的工作原理。
如果你的原文是ABCD,你想做1的移位来应用ceaser密码,这意味着A将是B,B将是C,C将是D,D将是E。
length 是您的字符串长度,text 是您的原始文本,shift 是您要应用 ceaser 密码的字母表的移位次数。
让我们来看一个示例文本:abcd
第 1 班
现在假设 c 值为 'a'
所以这个语句是(int)c - (int)'a' + shift) % 26 + (int)'a')
通常会做 (97-97+1)%26+97
(1%26)+97
1+97
98
这是 b 的 ascii 等价物。这就是为什么在你的代码中整个操作在最后转换为 char:
**(char)**(((int)c - (int)'a' + shift) % 26 + (int)'a')
希望它有意义
如"Max Hampton"所说,ASCII table中字母的取值从97开始(小写字母)。
因此,例如,如果您有字母 c='p'
,则 c = 112。还有 'a'=97,因此 'p'-'a' = 112-97 = 15(注意:p 是字母表中的第 16 位)。
现在我们添加移位(虽然 p 现在向后移动了 1 步,但我们稍后会修复它)。让移位为 3(我们想要 p->s)
现在我们得到 15+3 = 18。18%26 = 18。
现在进行修复:18 + 'a' = 18+97 = 115 = 's'(1 又回来了)
完成:)
#include<iostream>
#include<string>
using namespace std;
int Ceasers_Cipher()
{
int y;
string x;
int r;
cout << "enter any sentence" << endl;
getline(cin, x);
y = x.size();
cout << "enter rotation" << endl;
cin >> r;
for (int i = 0; i < y; i++)
{
if (x[i] >= 'a' && x[i] <= 'a'+(26-r))
{
x[i] += r;
}
else if (x[i] >= 'a' + (26 - r)+1 && x[i] <= 'z')
{
x[i] -= 26-r;
}
else if (x[i] >= 'A' && x[i] <= 'A' + (26 - r))
{
x[i] +=r;
}
else if (x[i]>='A' + (26 - r) + 1 && x[i] <= 'Z')
{
x[i] -= 26-r;
}
}
cout << x << endl;
return 0;
}
int main()
{
Ceasers_Cipher();
}