Проект Эйлера (20 задача) продолжит знакомить Вас с длинной арифметикой. В данном случае – с перемножением очень больших чисел
Узнать больше в телеграм-канале: ProjectEuler++
n! означает n × (n − 1) × … × 3 × 2 × 1
Например, 10! = 10 × 9 × … × 3 × 2 × 1 = 3628800,
и сумма цифр в числе 10! равна 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.Найдите сумму цифр в числе 100!.
Функции необходимые для решения
Поскольку число из задания (100!) будет длиной 100 – 200 цифр, то в обычные типы данных оно не поместится. Потому для хранения числа будем использовать массив, в ячейках которого будут храниться отдельные его цифры.
Однако обратите внимание, что цифры в массиве идут в обратном порядке, чем в числе. Слева находятся младшие разряды (7), а справа – старшие (1).
Также нам понадобится знать количество цифр, занесенных в массив. Это нам необходимо знать, потому что иначе при каждой итерации нам придется проходить всю длину пустого массива. Однако об этом позже.
Потому будем записывать количество занесенных цифр в массив (длину числа) в нулевую ячейку массива (num_arr[0]).
В итоге число 1234567 в массиве будет сохранено в виде:
Для удобства работы длину массива запишем через константу:
Это необходимо, потому что иначе при изменениях в программе придется вручную менять это значение в нескольких местах.
Алгоритм очень простой. Перебираются числа до ста включительно и с помощью функции multiply() перемножаются между собой.
При этом первое число (1) сразу заносим в массив при его инициализации:
При этом, однако, напомню, что первое число (1) в массиве – это количество занесенных в массив цифр.
После перемножения ряда чисел (от 1 до 100) между собой. Ответ с начала будет сохранен в массиве в виде ряда цифр. И в итоге он будет получен сложением цифр в массиве посредством функции get_sum_dig().
Для измерения времени работы программы подключаем библиотеку time.h:
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
Функция принимает два числа (num_ar1[] и num2), причем одно из них в виде массива цифр.
Работает она так:
Работа функции очень проста. Указатель просто проходит по массиву и в итоге суммирует числа в ячейках.
Поскольку в дальнейшем эти функции могут быть применены в других программах, то контекст может измениться. Потому, чтобы избежать неправильной работы, в них сделана проверка корректности принимаемого значения.
В итоге значения чисел, выходящие за рамки, на которые рассчитана функция, она считать не будет и сразу вернет 0.
Однако программа при этом не прервется, просто будут считаться произведения следующих чисел. Потому, чтобы не гадать потом о причинах некорректного ответа, функция выведет свое название, некорректное число и предупреждение об ошибке в консоль.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
© 2023-2024 | eulerproject.ru