![]() |
Помогите с задачей по Тройкам Пифагора
Задание:
Если p - периметр прямоугольного треугольника со сторонами {a, b, c}, то есть ровно три целочисленных решения для p = 120:{20, 48, 52}, {24, 45, 51}, {30, 40, 50} Для какого значения p<1000 число решений максимально? Буду безмерно благодарен тем, кто сможет помочь, готов даже премировать :) Если что, ася 443-478 |
quaker_strelok в чём сложность в математической части или/и в части реализации?
В задании прямоугольный треугольник, это ж хрестоматийный случай по теореме Пифагора: Квадрат одной из сторон равен сумме квадратов других сторон. ![]() http://ru.wikipedia.org/wiki/Теорема_Пифагора Надеюсь теперь с математикой ясность. Теперь насчёт реализации. Если сильно напрягаться не хочется, пускай проц напрягается, можно задействовать банальный перебор, с помощью циклов. Код:
#include <stdio.h> Для p<1000 ответ будет таков Цитата:
|
Спасибо огромное, проблема у меня как раз в реализации, т.к. только начал изучать C++, но прога и впрямь долгая.. боюсь на компах в инсте она пол дня будет считаться...
1) Вы не уловили самого вопроса.. надо не максимальный периметр, при котором есть решения, а при каком периметре число решений максимально 2) if (p==(a + b + c) && a < (b + c) && b < (c + a) && c < (a + b)) в чем смысл этой строчки? 3) везде в циклах: for (int a=1; a<p; a++) for (int b=1; b<p; b++) for (int c=1; c<p; c++) для быстроты подсчета можно заменить p на p/2, т.к. сторона треугольника никогда не может быть больше полупериметра.. я прав? |
Сразу скажу, что код выполнен на С, из того что можно отнести лишь к С++ только удобный однострочный комментарий \\ вместо многострочного Сишного \* */.
По моим наблюдениям скорость проца не сильно влияет на настолько не оптимизированную программу. В данном случаи строчка Current p развлекает скучающего оператора ПК, но если с графикой в С знакомство есть то можно строить треугольники по текущим данным. :) 1)Да есть немного. Надеюсь результаты решения (какие возможные значения a b c на данный периметер) сохранять не нужно? 2) А это я сразу не уловил, что речь идёт про частный случай - прямоугольный треугольник, а не про треугольник в общем. Это условие не вырождение треугольника (другими словами, при таких условиях можно нарисовать треугольник). Я указал ниже в комментарии к коду, что данная строчка закомментирована. Это на тот случай, если кому-то понадобится про треугольник в общем случаи. 3)Да это так, любая из сторон треугольника всегда меньше полупериметра. Вот и первые шаги в оптимизации. Какая может быть нижняя граница для циклов? При заданном периметре, меньше чего не может быть наименьшая сторона прямоугольного треугольника? Это те вопросы, на которые не обходимо ответить, что б оптимизировать код. Касательно уточнённого задания, то каркас отлова необходимых значений данн, осталось добавить двух мерный массив для отлова: 1) значений периметров, 2) количество решений с ними, 3)сортировка и вывод наибольшего по количеству решений периметра. Без третьего пункта, примерно что-то на подобии такого Код:
printf("{a=%i b=%i c=%i} ", a, b, c); |
Спасибо еще раз :)
куда вставить код, который вы привели?:closed-to выложите полный код, если можно |
Внимание! Код не делает выборку совпадений значений сторон, но в разной последовательности, например для p=384 варианты {a=96 b=128 c=160} и {a=128 b=96 c=160} считаются абсолютно разными. Поскольку это происходит для всех p без исключения, то решение будет найденное корректно.
Код:
/*Если p - периметр прямоугольного треугольника со сторонами {a, b, c}, то есть ровно три целочисленных решения для Как видно из таблицы Valid perimeter = 840 match 16 - ответ, то есть 840 максимальный целочисленный периметр, меньший за 1000, прямоугольного треугольника, при котором число решений максимально и составляет 16, с учётом того что треугольник можно разворачивать. Если нужен результат чётко, то нужно поработать с двухмерным массивом pMaxRes[][]: отсортировать/найти наибольший элемент во втором ряде и вывести соответствующиё значение с первого. |
у меня последний код не выполняется...
1) по моему где-то лишняя скобочка.... 2) пишет что вот здесь printf("p max = %i",pMax); error C2065: 'pMax' : undeclared identifie |
Цитата:
Цитата:
Выделите текст внутри кода, что написал Admiral, - скопируйте - вставьте в файл .cpp - сохраните, откройте и откомпилируйте. |
Drongo, опс, действительно ошибка получилась у меня.. прошу прощения.
Цитата:
|
quaker_strelok - после уточнение задания на смену переменной pMax пришёл массив pMaxRes[][], впрочем можно было завести несколько переменных, но с массивом нагляднее.
Что б не повторять весь код заново приведу окончание программы Код:
b=pMaxRes[0][1]; |
Всё, спасибо всем, вроде всё отлично работает :)
|
Время: 00:01. |
Время: 00:01.
© OSzone.net 2001-