这是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)&#39; a&#39;
答案 0 :(得分:3)
为了让%26正确旋转编码字符,当移位将其推到'z'以外时,您需要处理值0-25。 'a' - 'z'的ASCII值为97-122,使旋转变得困难。通过从被移位的字符中减去“a”,您将字符映射到0-25的值,使用%26进行旋转。
答案 1 :(得分:1)
其ASCII值..字母a的ascii值为97,A的ascii值为65.
我希望您了解ceaser密码的工作原理。
如果您将ABCD作为原始文本并且您希望将1移位以应用ceaser cipher,则表示A将为B,B将为C,C将为D,D将为E.
长度是您的字符串长度,text是您的原始文本,shift是您希望应用ceaser cipher的字母数量的变化。
让我们拿一个示例文本:abcd
换班1
现在让我们假设c值是&#39; a&#39;
所以这个陈述是(int)c - (int)'a' + shift) % 26 + (int)'a')
通常会做(97-97 + 1)%26 + 97
(1%26)+97
1+97
98
是ascii等价于b。这就是为什么在你的代码中整个操作最后转换为char:
**(char)**(((int)c - (int)'a' + shift) % 26 + (int)'a')
希望它有意义
答案 2 :(得分:1)
as&#34; Max Hampton&#34;说,ASCII table中字母的值从97开始(在小写字母的情况下)。
因此,例如,如果你有字母c='p'
,那么c = 112.也&#39; a&#39; = 97,所以&#39; p&#39; - &#39; a&# 39; = 112-97 = 15(注意:p是字母表中的第16位)。
现在我们添加了班次(虽然p现在向前移动一步,我们将在稍后修复它)。让班次为3(我们想要p-> s)
现在我们得到15 + 3 = 18. 18%26 = 18。
现在为修复:18 +&#39; a&#39; = 18 + 97 = 115 =&#39; s&#39; (1回到这里)
并完成:)
答案 3 :(得分:0)
#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();
}