Проект Эйлера (9 задача) заставит вспомнить суть детского стишка про “Пифагоровы штаны” и решается довольно легко. Однако все можно улучшить
Узнать больше в телеграм-канале: ProjectEuler++
Тройка Пифагора – три натуральных числа a < b < c, для которых выполняется равенство
- a2 + b2 = c2
Например, 32 + 42 = 9 + 16 = 25 = 52.
Существует только одна тройка Пифагора, для которой a + b + c = 1000.
Найдите произведение abc.
С помощью этой нехитрой поговорки мы на математике запоминали признак прямоугольности треугольника. А именно формулу:
Т.е. “сумма квадратов катетов треугольника (прямоугольного) равна квадрату его гипотенузы”. Не знаю, как это работает, однако запомнить помогало.
Функция is_triple принимает числа a, b, c и возвращает true, если они являются искомой тройкой. Работа ее основана на вышеизложенном признаке прямоугольного треугольника (a^2 +b^2 = c^2), однако есть одно улучшение:
Функция is_correct проверяет корректность полученной “тройки Пифагору” условию задачи (a + b + c = 1000). Она возвращает true, если условие корректно, иначе – false.
Подключаем стандартную библиотеку языка Си для работы с булевым типом данных. Для стандарта C99 булевый тип _Bool, который принимает значения 0 и 1. Данная библиотека позволяет использовать более привычный тип данных bool со значениями false и true.
Функция is_triple принимает в качестве параметра указатель на массив sq[ ]. В итоге изнутри функции становится возможным обращаться к элементам массива (находящегося в функции main) по их индексу sq[a].
Если значение справа и слева от “==” равны, то вернет true. Иначе – false
Глядя на условия задачи, первое, что приходит в голову – это для чисел a, b и c перебрать в цикле все числа от одного до тысячи. И каждую комбинацию чисел проверить на удовлетворение условий задачи. Мы конечно, так делать не будем, потому что 1000 вариантов значений числа a на 1000 значений b, да на 1000 значений c дадут миллиард вариантов.
Однако из такого варианта видно, что одно и то же число в процессе проверки будет вновь и вновь возводиться в квадрат миллионы раз.
Например:
В итоге, чтобы сократить количество операций возведения в квадрат, вычисляем квадраты натуральных чисел один раз и сохраняем их в массив по индексу. Например:
Т.е. индекс массива соответствует натуральному числу (4), а значение по этому индексу – квадрату числа (16).
Чтобы не перебирать миллиард комбинаций чисел воспользуемся несколькими соображениями:
Для измерения времени работы программы подключаем библиотеку time.h:
С помощью функции clock() измеряем время начала (begin) и окончания (end) работы программы. В итоге время работы будем находить как разность между ними.
(double) приводит число (в данном случае – результат вычислений end – begin) к вещественному типу данных double (числа с точкой)
CLOCKS_PER_SEC – это константа, сохраненная в библиотеке и зависящая от типа устройства, на котором запускается программа. В данном случае – это просто 1000
В итоге, понимание физического смысла приведенного в задании уравнения может сократить объем вычислений. Ответ на 9 задачу проекта Эйлера составил – 31875000. Программа работает быстро – за 0.0 секунд.
По традиции хотелось бы выразить глубочайшую признательность Сергею Балакиреву за его титанический труд по созданию бесплатных курсов и в частности, за “Язык программирования C/C++ для начинающих“.
© 2023-2024 | eulerproject.ru