Поскольку задача довольно таки несложная, потому все решение уместилось в функции main(). Однако, чтобы не “мельчить”, решил разбить ее на два скриншота.
До какого числа проверять
Как указано в задании, необходимо найти сумму всех чисел, удовлетворяющих условию. Потому возникает резонный вопрос: до какого числа проверять, а точнее, после какого числа гарантированно не может быть ответа?
Максимальной цифрой, которую может содержать число в десятичной системе счисления является девять. Ее факториал:
9! = 362880
… т.е. шестизначное число.
Самое большое шестизначное число будет также состоять из девяток:
В свою очередь сумма факториалов семизначного числа может быть максимум:
7 * 9! = 7 * 362880 = 2540160
…что является также семизначным числом.
Вычислим то же самое для восьмизначного числа:
8 * 9! = 2903040
Видно, что поскольку максимальная сумма факториалов цифр восьмизначного числа является числом семизначным, потому такие числа не могут уже содержать ответов.
И в итоге проверять числа стоит только до 2540160, потому что именно его дает сумма из 7 факториалов 9! (смотрите скриншот выше).
Вычисление факториала числа
В процессе работы программы значение факториалов чисел от 0 до 9 нам понадобится многократно. Потому разумно будет их один раз вычислить и сохранить.
Для хранения факториалов чисел будем использовать массив, потому что это позволяет обращаться к значению по индексу.
fact[число] = факториал числа;
fact[3] = 6; //например
Значение 0! = 1 вносим в массив при его инициализации (смотрите выше скриншот). Значения факториалов вносим за один проход цикла for().
Описание работы программы
Как было указано выше, перебираем числа до максимально возможного (7 * 9!). Каждое из чисел необходимо проверить на соответствие условиям задания:
Число раскладываем на отдельные цифры.
1234 % 10 = 4; (последняя цифра числа)
Обращаясь к массиву по индексу числа, получаем значение его факториала.
fact[4] = 24;
Число обрезается.
1234 / 10 = 123;
Факториалы цифр суммируются.
Если в итоге находится искомое число, то оно суммируется к ответу.
Измеряем время работы программы
Для измерения времени работы программы подключаем библиотеку time.h:
#include <time.h>
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
Ответ и скорость работы программы (проект Эйлера - 34 задача)
В итоге ответ на 34 задачу проекта Эйлера составил 40730,программа считает ответ быстро – за 50 миллисекунд.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))