Зашифровать исходное предложение используя треугольник Паскаля - C#
Формулировка задачи:
C клавиатуры вводится предложение, слова в котором разделены символом ‘_’. Используя треугольник Паскаля зашифруйте исходное предложение по правилу:
- Из предложения выделяется слово;
- Из треугольника Паскаля выбирается строка с номером равным числу букв в слове;
- К-я буква исходного слова заменяется на букву, отстоящую от исходной на число букв, ука-занное в к-м столбце выбранной строки треугольника.
Решение задачи: «Зашифровать исходное предложение используя треугольник Паскаля»
textual
Листинг программы
// Подготовка данных
// Факториал
const int MAX = 21;
long[] fact = new long[MAX];
fact[0] = fact[1] = 1;
for (int i=2; i<fact.Length; i++)
{
fact[i] = checked(i * fact[i-1]);
}
// Треугольник Паскаля
var pascalTriangle = new int[MAX][];
for (int n=0; n<MAX; n++)
{
pascalTriangle[n] = new int[n+1];
for (int k=0; k<=n; k++)
{
checked
{
long combination = fact[n] / (fact[k] * fact[n - k]);
pascalTriangle[n][k] = (int)combination;
}
}
}
// Шифрование
const string ABC = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
string text = "ШИРОКАЯ_ЭЛЕКТРИФИКАЦИЯ_ЮЖНЫХ_ГУБЕРНИЙ_ДАСТ_МОЩНЫЙ_ТОЛЧОК_ПОДЪЁМУ_СЕЛЬСКОГО_ХОЗЯЙСТВА";
WriteLine(text);
var sb = new StringBuilder(text.Length);
foreach (string oneWord in text.Split('_'))
{
int[] pascalRow = pascalTriangle[oneWord.Length-1];
if (sb.Length > 0) sb.Append("_");
for (int i=0; i<oneWord.Length; i++)
{
char ch = oneWord[i];
int idx = ABC.IndexOf(ch);
Debug.Assert(idx != -1, string.Format("Letter '{0}' is absent", ch));
ch = ABC[(idx + pascalRow[i]) % ABC.Length];
sb.Append(ch);
}
}
text = sb.ToString();
WriteLine(text);