поиск пифагорейских троек (а, б, в) с а <= 200 - PullRequest
2 голосов
/ 22 октября 2010

В моем предыдущем посте по этому вопросу я добился небольшого прогресса (не обвиняя никого, кроме себя!), Поэтому я попытаюсь подойти к постановке задачи иначе.

как мнеидти о написании алгоритма для генерации списка примитивных троек?

Все, что мне нужно начать, это:

a) основная теорема: a^2 + b^2 = c^2

b)тот факт, что маленькие стороны тройки (a и b) должны быть меньше, чем 'n'

(примечание: 'n' <= 200 для этой цели) </p>

Как мнеидти о создании моих петель?Мне нужно 2 или 3 петли?

профессор дал мне несколько советов, но, увы, я все еще потерялся.Я не знаю, с чего начать строить свои петли.Мне нужно 2 или 3 петли?сделать цикл по a и b или мне нужно ввести переменную 'n' в собственный цикл?Это, вероятно, выглядит как очевидные подсказки опытным программистам, но мне кажется, что мне нужно больше держать руку ... любая помощь будет оценена!

Пифагорейская тройка - это группа a, b, c, где a ^2 + b ^ 2 = c ^ 2.Вам нужно найти все комбинации a, b, c, которые удовлетворяют вышеуказанному правилу, начиная с 0,0,0 до 200, 609 641. Первая тройка будет [3,4,5], следующая будет [5,12,13.] и т. д. n - длина малой стороны a, поэтому, если n равно 5, необходимо проверить все тройки с a = 1, a = 2, a = 3, a = 4, a = 5 и найти два случая, показанные вышекак пифагорейское,

РЕДАКТИРОВАТЬ

спасибо за все представленные материалы.Это то, что я придумал (используя python)

import math
for a in range (1,200):
    for b in range (a,a*a):
        csqrd = a * a + b * b
        c = math.sqrt(csqrd)
        if math.floor(c) == c:
                print (a,b,int(c))

, это возвращает трижды (200, 609 641), где 200 - верхний предел для «a», но вычисление верхнего предела для «b»остается хитрым.Не уверен, как бы я поступил об этом ... предложения приветствуются:)

Спасибо

Баба

ps Я не ищу решение, а скорее помогу в улучшении моегонавыки решения проблем.(обязательно нужно :-))

Ответы [ 6 ]

1 голос
/ 22 октября 2010

Чтобы вычислить верхний предел b ... конечно, мы не можем пройти за ^ 2 + b ^ 2 = (b + 1) ^ 2, так как разрыв между последовательными квадратами увеличивается. Теперь (b + 1) ^ 2 - это b ^ 2 + 2b + 1, поэтому мы можем остановиться на b, когда a ^ 2 <2b + 1. (На самом деле, для нечетного a самая большая тройка - это когда b = (a ^ 2 - 1) / 2, а затем a ^ 2 + b ^ 2 = (b + 1) ^ 2.) </p>

Давайте рассмотрим даже. Тогда нам нужно рассмотреть a ^ 2 + b ^ 2 = (b + 2) ^ 2, поскольку 2b + 1 обязательно нечетно. Теперь, (b + 2) ^ 2 - b ^ 2 = 4b + 4, поэтому мы рассматриваем a ^ 2 = 4b + 4 или b = (a ^ 2 - 4) / 4 как самое высокое b (и как и раньше мы знаем, что это б работает).

Поэтому, для данного a, вам нужно проверить bs до

(a ^ 2 - 1) / 2 (нечетное)

(a ^ 2 - 4) / 4 (четное)

1 голос
/ 22 октября 2010

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

Как только вы прочитаете n, вы просто зацикливаете a с 1, затем в этом цикле вы зацикливаете b с a. Затем вы проверяете, если a <= n и b <= n. Если да, вы проверяете, является ли a^2 + b^2 квадратом (если его можно записать как c^2, где c - целое число). Если да, вы выводите соответствующий триплет. Вы можете остановить первый цикл один раз a > n, а второй цикл один раз b > n.

0 голосов
/ 22 октября 2010

Разбейте проблему на подзадачи.Первая подсказка заключается в том, что у вас есть верхняя граница n для значения c.Давайте начнем с c=1 ---, давайте посмотрим, сколько триплетов можно сформировать с помощью:

a^2 + b^2 = 1

Теперь давайте установим a = 1 to c-1.Это означает, что мы должны проверить, является ли b целым числом, таким, что b^2 = c^2 - a^2 и b^2 = int(b)^2.

0 голосов
/ 22 октября 2010

Таким образом, пифагорейские рубцы, к счастью, имеют два свойства, которые делают это не так уж плохо, чтобы решить:

Во-первых, все числа в тройке должны быть целыми числами (это означает, что вы можете вычислить a^2 + b^2, и у вас есть тройка, если c^2 является целым числом, а не с плавающей точкой). Кроме того, c ограничено значениями a и b.

Таким образом, это должно сообщить вам, сколько переменных у вас действительно есть (что будет определять ваш алгоритм - в частности, сколько для циклов вам нужно). Последняя часть информации проинформирует вас о том, как долго нужно проходить диапазон. Я пытался быть расплывчатым в соответствии с вашей просьбой, но дайте мне знать, если вы хотите что-то более конкретное.

0 голосов
/ 22 октября 2010

Учитывая любые a и b, вы можете вычислить, каким должно быть c.Вы также можете проверить, является ли полученная буква C целым числом.Имея это в виду, вам нужно проверить все значения a и b и найти те, которые дают вам целое число c.

Это займет всего два цикла (один для a и один для b).Оставьте комментарии, если вам нужна дополнительная помощь, и дайте мне знать, какие у вас проблемы.

0 голосов
/ 22 октября 2010

оставляя формулу и язык в покое, вы пытаетесь найти каждую комбинацию двух переменных, a и b, так ...

foreach A   
  foreach B  
    foreach C
      do something  with B and A  and eval with c  
    end foreach C  
  end foreach B  
end foreach A
for ($x = 1; $x <= 200; $x++) {
    for ($y = 1; $y <= 200; $y++) {
        for ($z = 1; $z <= 200; $z++) {
            if ($x < $y) {
                if (pow($x, 2) + pow($y, 2) == pow($z, 2)) {
                    echo "$x, $y , $z<br/>";
                }
            }
        }
    }
}

3, 4, 5
5, 12, 13
6, 8, 10
...

81, 108, 135
84, 112, 140
84, 135, 159

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