Вы делаете много повторной и ненужной работы. Вы знаете это A^2 + B^2 = C^2
и знаете это C > B > A
. Не имеет значения, хотите ли вы сказать C > A > B
, потому что любое найденное вами решение будет удовлетворено C > B > A
. Например, возьмите 12 и решение 3, 4, 5. На самом деле не имеет значения, говорите ли вы, что A=3
и B=4
или A=4
и B=3
. Зная это, мы можем настроить петли каждого для l oop.
A
может go с 1
до num
, это нормально. Технически это может на go немного меньше, так как вы добавляете к нему другое значение, которое должно быть не менее 1
.
B
тогда может go от A+1
до num
поскольку оно должно быть больше, чем оно.
Так что насчет C
? Ну, это не нужно go от 1
, так как это невозможно. На самом деле мы заботимся только о A + B + C = num
, поэтому решите за C
, и вы получите C = num - A - B
. Это означает, что вам не нужно использовать al oop, чтобы найти C
, поскольку вы можете просто найти его. Зная это, вы можете сделать что-то вроде этого:
In [142]: def find_triplet(num):
...: for a in range(1, num-1):
...: for b in range(a+1, num):
...: # A^2 + B^2 = C^2
...: # And A+B+C = N
...: c = num - a - b
...: if c > 0:
...: if a*a + b*b == c*c:
...: print(f'{a} {b} {c}')
...: else:
...: break
...:
In [143]: find_triplet(30)
5 12 13
Так зачем проверять, если C
> 0, и ломаться иначе? Ну, если вы знаете C = num - A - B
и увеличиваете B
, то, как только B
станет слишком большим, C
будет продолжать становиться все более и более отрицательным. Поэтому вы можете проверить, если C > 0
, а если нет, вырваться из этого внутреннего l oop, чтобы иметь A
приращение и B
сброс.