Flat Preloader Icon

Project Euler (answers)

Проект Эйлера: Ответ и решение 16 задачи (Сумма цифр степени)

Проект Эйлера (16 задача) позволяет поработать с большими числами. Так как задача чисто учебная, потому просто воспользовался массивом цифр.

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

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

215 = 32768, сумма цифр этого числа равна 3 + 2 + 7 + 6 + 8 = 26.

Какова сумма цифр числа 21000?

Всегда Вам рады)

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

Проект Эйлера 16 задача (первая часть решения)
Проект Эйлера 16 задача (первая часть решения)

Программа несложная, однако, чтобы сильно “не мельчить”, разбил решение на два скриншота.

Проект Эйлера 16 задача (вторая часть решения)
Проект Эйлера 16 задача (вторая часть решения)

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

Как хранить большое число

Поскольку число из задания (2 в 1000-й степени) будет состоять из нескольких сотен цифр, потому в обычный тип данных оно заведомо не влезет. Однако нам необходимо будет хранить как промежуточные результаты, так и конечное число. Самым простым способом в итоге будет разбить число на отдельные цифры и хранить их в массиве.

 

Возводим число в степень

Что такое 2 в 1000-й степени? Это просто число 2 умноженное само на себя 1000 раз. Потому заменим возведение в степень на умножение.

Алгоритм будет следующий (смотрите скриншот выше):

  • Каждая цифра в массиве (каждая цифра числа) умножается на два.
  • При этом, если число в ячейке получается двузначным, то младший регистр числа (единицы) сохраняются в нее, а старший (десятки) переносится и прибавляется к числу в следующей ячейке.

Таким образом за 999 проходов по массиву число возводится в 1000-ную степень.

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

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

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

  • #include <time.h> 

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

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

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

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

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

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

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

В итоге ответ на 16 задачу проекта Эйлера составил 1366, программа считает ответ практически мгновенно 1-2 миллисекунды. 

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

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

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

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

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

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

© 2023-2024 | eulerproject.ru