Описание работы программы - проект Эйлера (13 задача)
Описание идеи алгоритма
Порядок работы программы очень простой и будет следующим:
Представляем 50-значные числа из задания в удобном для обработки виде – в виде массива цифр.
Складываем числа между собой “столбиком”, как в школе.
Выделяем из полученного ответа первые 10 цифр.
Заносим числа в массив
Заносим числа в виде строки
Для того чтобы использовать числа из задания в программе, их сначала необходимо как то сохранить в ней.
Можно конечно забить вручную, однако, это не наш метод. Потому сначала сохраним их в виде строки, просто скопировав из задания и “закавычив” при сохранении в num_str[].
Заносим числа из строки в массив
Что такое строка? По сути своей – это обычный массив чисел. Однако есть отличия:
В конце этого массива обязательно стоит символ окончания строки ‘\0’.
Цифры в таком массиве означают не сами себя, а численный код того или иного символа. Например, 65 означает символ ‘А’.
Значения всех кодов хранятся в так называемой сводной таблице кодов ASCII. Однако нас интересует, что символ ‘0’ (ноль) имеет код 48, а ‘1’ (один) – 49 и т.д.
В итоге вполне достаточно из кода символов цифр вычитать 48, чтобы получить сами цифры.
Обратите внимание, что в задании числа шли “слева-направо” (123456789…), а в массив они будут заноситься “справа-налево” (987654321…). Делаем так потому, что так будет проще складывать потом числа.
Складываем числа
Для хранения суммы ста 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 цифр числа из массива.
Для измерения времени работы программы подключаем библиотеку time.h:
#include <time.h>
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
Ответ и скорость работы программы - проект Эйлера (13 задача)
В итоге ответ на 13 задачу проекта Эйлера составил 5537376230, программа работает мгновенно.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
Есть вопросы, господа? Отвечаем спокойно, четко и только по делу))