Flat Preloader Icon

Project Euler (answers)

Проект Эйлера: Ответ и решение 13 задачи (Большая сумма)

Проект Эйлера (13 задача) позволяет поближе познакомиться с длинной арифметикой, а конкретно – со сложением очень больших чисел

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

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

Найдите первые десять цифр суммы следующих ста 50-значных чисел.

Проект Эйлера (13 задача) - задание
задача Эйлера 13 (задание)

Картинка с числами слишком большая, задание полностью можно посмотреть на официальном сайте “проекта Эйлера”

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

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

Описание идеи алгоритма

Порядок работы программы очень простой и будет следующим:

  • Представляем 50-значные числа из задания в удобном для обработки виде – в виде массива цифр.
  • Складываем числа между собой “столбиком”, как в школе.
  • Выделяем из полученного ответа первые 10 цифр.

Заносим числа в массив

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

Заносим числа в виде строки

Для того чтобы использовать числа из задания в программе, их сначала необходимо как то сохранить в ней.

Можно конечно забить вручную, однако, это не наш метод. Потому сначала сохраним их в виде строки, просто скопировав из задания и “закавычив” при сохранении в num_str[].

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

Заносим числа из строки в массив

Что такое строка? По сути своей – это обычный массив чисел. Однако есть отличия:

  • В конце этого массива обязательно стоит символ окончания строки ‘\0’.
  • Цифры в таком массиве означают не сами себя, а численный код того или иного символа. Например, 65 означает символ ‘А’.

Значения всех кодов хранятся в так называемой сводной таблице кодов ASCII. Однако нас интересует, что символ ‘0’ (ноль) имеет код 48, а ‘1’ (один) – 49 и т.д.

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

Обратите внимание, что в задании числа шли “слева-направо” (123456789…), а в массив они будут заноситься “справа-налево” (987654321…). Делаем так потому, что так будет проще складывать потом числа.

Складываем числа

Функция для сложения двух чисел - проект Эйлера (13 задача)
Функция для сложения двух чисел (задача Эйлера 13)
  • Для хранения суммы ста 50-значных чисел создаем массив немного большей длины, потому что полученное число будет на два-три порядка длиннее.

Возьмем для примера два числа и начнем их складывать “столбиком”:

  • 12345
  • 67890

Складываем самый младший разряд: 5 + 0 = 0, пишем 0

  • 0

Складываем второй разряд: 4 + 9 = 13. 3 записываем (13 % 10 = 3), а оставшуюся 1 “держим в уме” (13 / 10 = 1)

  • 30

Складываем третий разряд: 3 + 8 = 11 и добавляем к нему остаток от предыдущего сложения 11 + 1 = 12. Далее точно также 2 записываем, а остаток (1) переносим на следующий разряд.

  •  …230 и так далее.

Думаю, смысл понятен. В итоге функция пробегает по массиву и все 50 чисел складывает между собой, перенося остатки на старшие разряды.

Ну а для вывода ответа не стал придумывать каких-либо отдельных функций, а просто вывел через printf() старшие 10 цифр числа из массива.

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

Директива препроцессора #define заменяет строку LEN_NUM в программе на цифры 50

Оператор “ИЛИ

То же самое, что rest = rest / 10

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

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

  • #include <time.h> 

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

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

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

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

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

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

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

В итоге ответ на 13 задачу проекта Эйлера составил 5537376230, программа работает мгновенно. 

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

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

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

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

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

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

© 2023-2024 | eulerproject.ru