Flat Preloader Icon

Project Euler (answers)

Проект Эйлера: Ответ и решение 34 задачи (Факториалы цифр)

Проект Эйлера (34 задача). Даже такую несложную задачу можно при желании оптимизировать, а время ее выполнения – ускорить.

Узнать больше в телеграм-канале: ProjectEuler++

Условия задачи

145 является любопытным числом, поскольку 1! + 4! + 5! = 1 + 24 + 120 = 145.

Найдите сумму всех чисел, каждое из которых равно сумме факториалов своих цифр.

Примечание: поскольку 1! = 1 и 2! = 2 не являются суммами, учитывать их не следует.

Добро пожаловать на сайт))

Решение (проект Эйлера - 34 задача)

Проект Эйлера (34 задача) - решение, часть 1
Решение, часть 1

Поскольку задача довольно таки несложная, потому все решение уместилось в функции main(). Однако, чтобы не “мельчить”, решил разбить ее на два скриншота.

До какого числа проверять

Как указано в задании, необходимо найти сумму всех чисел, удовлетворяющих условию. Потому возникает резонный вопрос: до какого числа проверять, а точнее, после какого числа гарантированно не может быть ответа?

Максимальной цифрой, которую может содержать число в десятичной системе счисления является девять. Ее факториал:

  • 9! = 362880

… т.е. шестизначное число.

Самое большое шестизначное число будет также состоять из девяток:

  • 999999

Сумма факториалов его цифр составит:

  • 9! + 9! + 9! + 9 ! + 9! + 9! = 6 * 9! = 6 * 362880 = 2177280

семизначное число в итоге.

В свою очередь сумма факториалов семизначного числа может быть максимум:

  • 7 * 9! = 7 * 362880 = 2540160

…что является также семизначным числом.

Вычислим то же самое для восьмизначного числа:

  • 8 * 9! = 2903040

Видно, что поскольку максимальная сумма факториалов цифр восьмизначного числа является числом семизначным, потому такие числа не могут уже содержать ответов.

И в итоге проверять числа стоит только до   2540160, потому что именно его дает сумма из 7 факториалов 9! (смотрите скриншот выше).

Вычисление факториала числа

В процессе работы программы значение факториалов чисел от 0 до 9 нам понадобится многократно. Потому разумно будет их один раз вычислить и сохранить.

Для хранения факториалов чисел будем использовать массив, потому что это позволяет обращаться к значению по индексу.

  • fact[число] = факториал числа;
  • fact[3] = 6; //например

Значение 0! = 1 вносим в массив при его инициализации (смотрите выше скриншот). Значения факториалов вносим за один проход цикла for().

Описание работы программы

Проект Эйлера (34 задача) - решение, часть 2
Решение, часть 2

Как было указано выше, перебираем числа до максимально возможного (7 * 9!). Каждое из чисел необходимо проверить на соответствие условиям задания:

  • Число раскладываем на отдельные цифры.
  • 1234 % 10 = 4; (последняя цифра числа)
  • Обращаясь к массиву по индексу числа, получаем значение его факториала.
  • fact[4] = 24;
  • Число обрезается.
  • 1234 / 10 = 123;
  • Факториалы цифр суммируются.

Если в итоге находится искомое число, то оно суммируется к ответу.

Измеряем время работы программы

Для измерения времени работы программы подключаем библиотеку time.h:

  • #include <time.h> 

С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.

* Примечания:

clock_t это тип данных, определенный через typedef. По сути это обычный целочисленный long

(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)

CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000

Ответ и скорость работы программы (проект Эйлера - 34 задача)

Проект Эйлера (34 задача) - ответ
34 задача ответ

В итоге ответ на 34 задачу проекта Эйлера составил 40730, программа считает ответ быстро – за 50 миллисекунд. 

По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.

проект Эйлера
Курс "C/C++ для начинающих"

Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))

Есть вопросы, господа?

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

Проект Эйлера (ответы) | © 2023-2024 | eulerproject.ru

© 2023-2024 | eulerproject.ru