Проблема с A и B(#1001) Шифр Цезаря(#1003)
#1002

Задача g6_1002: Трамвайные билеты.
Написать программу определения количества шестизначных "счастливых" трамвайных билетов, у которых сумма первых трех цифр совпадает с суммой трех последних.
Оптимизировать решение по времени выполнения. Количество билетов вывести в файл output.txt
Решение g6_1002:
Логично устроить цикл в цикле, затем считать сумму первых и последних трех цифр и сравнивать их между собой.
Как считать сумму цифр?

      For Spec := 1 to 3 do
      Begin
        K := K + Luck mod 10;
        Luck := Luck div 10;
      End;

где Luck - число, в котором надо посчитать сумму цифр, K - сумма цифр (более правильная реализация с циклом while, но это я предоставлю реализовать вам ;).
Итак, у нас два цикла, в которых перебираются 1000 чисел, итого 1000000 итераций, т.е. мы перебираем все возможные билеты, но делаем это не очень явно.
Попробуем разогнать программу в 1000 раз :). В этом нам поможет динамическое программирование, т.е. сохранение уже полученных однажды результатов.
Рассмотрим трехзначное число. Сумма цифр этого числа может принимать значения от 0 до 27, т.е. мы можем просто посчитать сколько чисел от 0 до 999 с данной суммой цифр и записать это значение в массив от 0 до 27.
Т.к. второе число также трехзначное, то мы можем пользоваться для него тем же массивом данных. Тогда, после подсчета кол-ва чисел с данной суммой цифр, мы можем достаточно просто подсчитать количество "счастливых билетов":

      For I := 0 to 27 do
        L := L + M[I] * M[I];

где I - счетчик, L - кол-во счастливых билетов, M - массив значений суммы цифр.
Удачи вам в реализации! Скачать тесты к задаче
Наверх