Проблема с шифром Цезаря C# с отрицательными числами

#c# #algorithm

Вопрос:

Таким образом, в основном код отлично работает для некоторых входных данных , но я хочу ввести «abcdefghijklmnopqrstuvwxyz», а затем в позиции «-3» ожидаемый результат должен быть «xyzabcdefghijklmnopqrstuvw», может кто-нибудь помочь ?

 Console.WriteLine("Type a string to encrypt:");  string UserString = Console.ReadLine();   Console.WriteLine("n");   Console.Write("Type in the position:");  int key = Convert.ToInt32(Console.ReadLine());  Console.WriteLine("n");    Console.WriteLine("Encrypted Data");   string cipherText = Encipher(UserString, key);  Console.WriteLine(cipherText);  Console.Write("n");   char cipher(char ch, int key)  {  if (!char.IsLetter(ch))  {   return ch;  }   char d = char.IsUpper(ch) ? 'A' : 'a';  return (char)((((ch   key) - d) % 26)   d);   }   string Encipher(string input, int key)  {  string output = string.Empty;   foreach (char ch in input)  output  = cipher(ch, key);   return output;  }  

Ответ №1:

Если вы хотите использовать какое-либо абитральное число, вам следует использовать немного доработанный остаток:

 result = (source % mod   mod) % mod;  

В нашем случае ( mod == 26 ) у нас будет (я поставил key % 26 вместо просто key для того, чтобы не было переполнения целого числа в случае огромного key , например key = int.MaxValue ):

 static char cipher(char ch, int key) {  if (ch gt;= 'a' amp;amp; ch lt;= 'z')  return (char)('a'   ((ch - 'a'   key % 26) % 26   26) % 26);  else if (ch gt;= 'A' amp;amp; ch lt;= 'Z')  return (char)('A'   ((ch - 'A'   key % 26) % 26   26) % 26);   return ch; }  

Тогда вы можете поставить (давайте использовать Linq)

 string Encipher(string input, int key) =gt;   string.Concat(input.Select(c =gt; cipher(c, key)));  // Same as Encipher, but with negative key: note -key  string Decipher(string input, int key) =gt;   string.Concat(input.Select(c =gt; cipher(c, -key)));