Условия задачи можно почитать тут.
Решение
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Функция НайтиКомбинации() Экспорт МассивРешений = Новый Массив; НайтиВарианты(1, 1, 0, "1", МассивРешений, 1); // Старт рекурсии Возврат МассивРешений; КонецФункции Процедура НайтиВарианты(Позиция, ТекущееЧисло, ТекущаяСумма, ТекущееВыражение, МассивРешений, ПоследнийОператор) // ПоследнийОператор: 1 - "+", -1 - "-" Если Позиция >= 9 Тогда ИтоговаяСумма = ТекущаяСумма + ПоследнийОператор * ТекущееЧисло; Если ИтоговаяСумма = 99 Тогда МассивРешений.Добавить(ТекущееВыражение + " = 99"); КонецЕсли; Возврат; КонецЕсли; СледующаяЦифра = Число(Сред("123456789", Позиция + 1, 1)); // Вариант 1: Объединение цифр (без оператора) НайтиВарианты( Позиция + 1, ТекущееЧисло * 10 + СледующаяЦифра, ТекущаяСумма, ТекущееВыражение + СледующаяЦифра, МассивРешений, ПоследнийОператор ); // Вариант 2: Добавление "+" НайтиВарианты( Позиция + 1, СледующаяЦифра, ТекущаяСумма + ПоследнийОператор * ТекущееЧисло, ТекущееВыражение + " + " + СледующаяЦифра, МассивРешений, 1 ); // Вариант 3: Добавление "-" НайтиВарианты( Позиция + 1, СледующаяЦифра, ТекущаяСумма + ПоследнийОператор * ТекущееЧисло, ТекущееВыражение + " - " + СледующаяЦифра, МассивРешений, -1 ); КонецПроцедуры |
Алгоритм работы
Рекурсивный перебор всех возможных комбинаций операций, учитывая комбинаторные принципы.
- Рекурсивный перебор: На каждом шаге рассматриваем 3 варианта:
- Объединение с предыдущей цифрой (формирование многозначного числа)
- Добавление оператора “+”
- Добавление оператора “-”
- Математическая модель:
- ТекущееЧисло — накапливает объединенные цифры
- ТекущаяСумма — хранит промежуточный результат
- ПоследнийОператор — запоминает предыдущую операцию (+1 или -1)
- Базовый случай: Когда обработаны все 9 цифр, проверяем равенство суммы 99.
