#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)));