Время прочтения: 3 мин.

Для начала сделаем функции по определению количества десятков и сотен в числе.

publicstaticintGetDes(int a)
        {
            return a % 100 / 10;
        }
        publicstaticintGetDes(string a)
        {
           returnConvert.ToInt32(a) % 100 / 10;
        }

Возвращает количество десятков т.е. из чисел 56 и 158 вернет 5.

publicstaticintGetSot(int a)
        {
            return a / 100;
        }
        publicstaticintGetSot(string a)
        {
           returnConvert.ToInt32(a) / 100;
        }

Возвращает количество сотен.

Чуть-чуть о логике: если друг за другом идут оба числа одного и того же порядка или впереди идет меньшего порядка, например, {7, 9} или {7, 90}, то должна происходить просто склейка 79 или 790 соответственно.

Обратим внимание на последовательность {900, 50, 2}: при наборе, где число 3-его, 2-ого и 1-ого порядков необходимо учитывать, что нужно и склеивать, и складывать числа так, что возможны комбинации 952, 900-52, 900-50-2.

НаборДействиеРезультат
{7, 9}Склейка79
{7, 90}Склейка790
{900, 50, 2}Сложение, склейка и сложение, склейка952, 900-52, 900-50-2

Переходим к алгоритму, с пояснениями:

List<int>listInt = new List<int>() { 900, 50, 2, 60, 7, 80, 2, 40, 6 };
List<string> ls = new List<string>() { listInt[0].ToString() };

Создаем два списка:

— один числовой и заносим туда сразу все числа из номера телефона;

— один строковый, туда сразу заносим первое число.

Так как нулевой элемент мы уже записали, то запускаем цикл, который пойдет со следующего элемента списка и пишем условия, как уже обсуждалось ранее, т.е. что числа одного порядка или следующее число больше. Если условие выполняется, то все элементы строкового списка перезаписываются с дописанным числом-просто склейка строк, если нет, то тоже самое, но плюс еще и надо к каждому ЧИСЛУ из строкового списка прибавить число ИЗ числового списка.

for (inti = 1; i<listInt.Count; i++)
            {
               if (listInt[i] > 99 //второечислосотни
                   || GetDes(listInt[i])>0 &&GetDes(listInt[i-1])>0 //обачисладесятки
                    || (GetDes(listInt[i]) == 0 &&GetDes(listInt[i - 1]) == 0 &&GetSot(listInt[i]) == 0 &&GetSot(listInt[i - 1]) == 0)// единицы
                    || listInt[i]>listInt[i - 1] //второебольшепервого
                    )
                {
                    for (int n = 0; n <ls.Count; n++)
                    {
                        ls[n] += listInt[i];
                    }
                }// если одного порядка, то склейка
                else
               {
                    int steps = ls.Count;
                    for (int n = 0; n < steps; n++)
                    {
                        ls.Add((Convert.ToDecimal(ls[n]) + listInt[i]).ToString());
                        ls[n] += listInt[i];
                    }
                }
            }

Получится следующий набор возможных номеров:

Дальше убираем лишние элементы списка, где длина строки не равна 10 символам. Реализуем это в  C#: в using пишем usingSystem.Linq; а в конце следующее условие:

           ls = ls.Where(r =>r.Length == 10).ToList();

Результатом отработки получился список из 4 возможных номеров:

Итак, мы получили список возможных номеров телефонов из текста транскрибации.

Такой алгоритм применим, например, и для составления инн или чего-либо похожего из списка чисел.