我的项目:基本上,我在研讨会上编写了一个小的加密程序,它接受用户输入并检查循环中的字符位置是否均匀,如果是,它将在字符串的前面,否则在结束。它看起来像这样;
string userInput = "", encodedInput = "", evenChar = "", oddChar = "";
int charCount = 0;
Console.WriteLine("Input your text: ");
userInput = Console.ReadLine();
foreach(char character in userInput)
{
charCount++;
if ((charCount % 2) == 0)
{
evenChar = evenChar + character;
}
else
{
oddChar = character + oddChar;
}
encodedInput = evenChar + oddChar;
}
Console.WriteLine(encodedInput);
现在这种方式很好,当我输入"我的名字是杰夫!"我得到了" im aei ef!fjs mny h"。
现在我正在尝试编写一个解密循环。我选择用于解密的方法基本上是从字符串中取出最后一个字符,将其添加到一个新的空字符串,然后从字符串中取出第一个字符,并将其添加到相同的空字符串中,然后简单地减少加密的总长度string并增加第一个字符的位置。
char lastChar = ' ';
char firstChar = ' ';
StringBuilder decodedInput = new StringBuilder();
int len = encodedInput.Length;
int len2 = 0;
foreach(char character in encodedInput)
{
lastChar = encodedInput[len - 1];
decodedInput.Append(lastChar.ToString());
len--;
firstChar = encodedInput[len2];
len2++;
decodedInput.Append(firstChar.ToString());
}
Console.WriteLine(decodedInput.ToString());
现在这在大多数情况下工作正常。它需要相同的" im aei ef!fjs mny h"和输出"我的名字是jeff !! ffej si eman ym ih"。它反映了字符串,因为每个循环都会产生字符,所以"我的名字是jeff"变成36个字符。我已经尝试将循环减半,但你仍然会得到一些镜像。
我很清楚有更好或更简单的方法来解读这个,但我想这样做是出于教育目的。
亲切的问候,
Vocaloidas。
答案 0 :(得分:3)
不要遍历编码输入的每个字符,因为最终会处理每个字符两次。您已使用len
和len2
变量在字符串中上下计数,因此如果您将foreach
替换为:
while (len > len2)
这只会处理字符串的每个字符
当字符串是奇数个字符以处理中间字符时,即当len
和len2
相等时,您将不得不做一些特殊的外壳。为此添加以下内容:
if (len == len2)
break;
在循环的中间,以便它变为:
while (len > len2)
{
lastChar = encodedInput[len - 1];
decodedInput.Append(lastChar.ToString());
len--;
if (len == len2)
break;
firstChar = encodedInput[len2];
len2++;
decodedInput.Append(firstChar.ToString());
}