c# - 凯撒密码的问题
问题描述
我在 C# 中解密凯撒密码时遇到问题。我们必须手动完成,加密和解密。我希望它写出所有的可能性,一一转移(然后很容易看到正确的解密,因为其他25
可能性是胡说八道)。问题是它只写了一种可能性,而不是26
. 我什么都试过了。你知道问题出在哪里吗?
string text = "Z programovani{}{}{}";
text = text.ToUpper();
string output = "";
int shift = 3;
foreach (char a in text)
{
int x = (int)a;
if (x >= 65 && x <= 90)
{
x += shift;
}
if (x == 32)
{
x -= shift;
}
if (x >90)
{
x = x - 26;
}
output += (char)x;
}
Console.WriteLine(output);
int i = 0;
do
{
string decoded = "";
foreach (char a in output)
{
int x = (int)a;
if (x >= 65 && x <= 90)
{
x += 1;
}
if (x > 90)
{
x = x + 26;
}
decoded += (char)x;
}
i++;
Console.WriteLine(decoded);
} while (i < 27);
Console.ReadKey();
解决方案
让我们提取一个方法(不要将所有内容都塞进单个方法中Main
;分解您的解决方案,使其更简单、更易于阅读和维护):
private static string Caesar(string value, int shift) {
if (null == value)
return null;
// Normalization: if we have shift out of [0..25] range, e.g. -3 or 125
shift = ((shift % 26) + 26) % 26;
StringBuilder sb = new StringBuilder(value.Length);
foreach (var c in value)
if (c >= 'a' && c <= 'z')
sb.Append((char)((c - 'a' + shift) % 26 + 'a'));
else if (c >= 'A' && c <= 'Z')
sb.Append((char)((c - 'A' + shift) % 26 + 'A'));
else
sb.Append(c);
return sb.ToString();
}
然后你就可以轻松使用它了:
using System.Linq;
...
string text = "Z programovani{}{}{}";
// Let's use Linq; loop
// for(int i = 0; i < 26; ++i) Console.WriteLine($"{i,2}: {Caesar(text, i)}");
// is an alternative
string result = string.Join(Environment.NewLine, Enumerable
.Range(0, 26)
.Select(i => $"{i,2}: {Caesar(text, i)}"));
Console.Write(result);
结果:
0: Z programovani{}{}{}
1: A qsphsbnpwboj{}{}{}
2: B rtqitcoqxcpk{}{}{}
3: C surjudprydql{}{}{}
4: D tvskveqszerm{}{}{}
5: E uwtlwfrtafsn{}{}{}
6: F vxumxgsubgto{}{}{}
7: G wyvnyhtvchup{}{}{}
8: H xzwoziuwdivq{}{}{}
9: I yaxpajvxejwr{}{}{}
10: J zbyqbkwyfkxs{}{}{}
11: K aczrclxzglyt{}{}{}
12: L bdasdmyahmzu{}{}{}
13: M cebtenzbinav{}{}{}
14: N dfcufoacjobw{}{}{}
15: O egdvgpbdkpcx{}{}{}
16: P fhewhqcelqdy{}{}{}
17: Q gifxirdfmrez{}{}{}
18: R hjgyjsegnsfa{}{}{}
19: S ikhzktfhotgb{}{}{}
20: T jlialugipuhc{}{}{}
21: U kmjbmvhjqvid{}{}{}
22: V lnkcnwikrwje{}{}{}
23: W moldoxjlsxkf{}{}{}
24: X npmepykmtylg{}{}{}
25: Y oqnfqzlnuzmh{}{}{}
推荐阅读
- mocha.js - 使用 mocha/chai 时如何避免在多个测试中重复期望
- python - 如何使用 python3 将 CIDR 转换为 IP 范围?
- php - 准备好的语句Mysql不起作用
- java - 将石英应用程序与另一台机器中的另一个石英通信
- amazon-web-services - 将弹性 IP 关联到 ec2 实例
- c# - 与此 Linq 表达式等效的 lambda 是什么?
- node.js - 不在firebase上工作,但在本地主机上工作
- django - 将提交表单中的文本呈现为 SO 的正文表单
- java - OutputStream.write 仅在 Java 中写入部分字符串
- python - TensorFlow 神经网络作为 API?