1, 11, 21, 1211, 111221, …
Каждое последующее число генерируется из предыдущего путём конкатенции цифры, из которой состоит группа одинаковых цифр и количества цифр в этой группе, для каждой группы одинаковых цифр в числе. Например:
1 читается как «одна единица», то есть 11
11 читается как «две единицы», то есть 21
21 читается как «одна двойка, одна единица», то есть 1211
1211 читается как «одна единица, одна двойка, две единицы», то есть 111221
111221 читается как «три единицы, две двойки, одна единица», то есть 312211
Напишите алгоритм, который определяет n-й член последовательности. Входные данные: n — натуральное число от 1 до 30 включительно.
Вывод: n-й член последовательности.
Пример:
1. n = 1
Output: 1
2. n = 4
Output: 1211
Разбор
Идея простая, для генерации n-го члена мы генерируем предыдущие
n-1,
зная начальное значение для n=1
. Необходимо отслеживать кол-во последовательных символов и ставить это число перед самим символом. Все детали смотрите в реализации.Реализация
using System;
using System.Collections.Generic;
public class Program
{
public static string CountAndSay(int n)
{
if (n == 1)
{
return "1";
}
var arr = new List<byte>() { 1 };
for (int i = 2; i <= n; i++)
{
byte count = 1;
int len = arr.Count;
var val = arr[0];
var newNumber = new List<byte>();
for (int j = 1; j < len; j++)
{
if (arr[j] == val)
{
count++;
}
else
{
newNumber.Add(count);
newNumber.Add(val);
count = 1;
}
val = arr[j];
}
if (count > 0)
{
val = arr[len - 1];
newNumber.Add(count);
newNumber.Add(val);
}
arr = newNumber;
}
return string.Join("", arr);
}
public static void Main()
{
Console.WriteLine("UniLecs");
Console.WriteLine(CountAndSay(4)); // 1211
Console.WriteLine(CountAndSay(5)); // 111221
Console.WriteLine(CountAndSay(6)); // 312211
}
}
👉 Пишите ваше решение в комментариях👇
@csharp_ci