Вы явно учитесь, так что было бы лучше, если бы вы все делали сами, но теперь у вас есть отличное решение от akalenuk, и я надеюсь, что вы тоже чему-то научитесь из него.
Если вы одновременно изучаете python, я дам вам решение, эквивалентное решению akalenuk, но на этот раз с пониманием списка, что является очень полезным механизмом:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, min( N/x, x) + 1 )
for z in [ (N - x*y) / (x+y) ]
if (N - x*y) % (x+y) == 0
if z <= y]
Дело в сокращении пространства решения. Приведенный выше код уже достаточно оптимизирован. Вы можете начать с чего-то вроде:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, x+1 )
for z in range(y+1)
if N == x*y + y*z + x*z]
Это будет длиться довольно долго. Итак, первым пунктом оптимизации может быть добавление условия на y:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, x+1 )
if x*y <= N
for z in range(y+1)
if N == x*y + y*z + x*z]
Это уже значительно сокращает время, так как для неперспективных y
цикл z
вообще не запускается. Затем вы заметите, что вы можете заменить этот оператор if явным вычислением максимума y, как это сделал akalenuk:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, min(x, N/x) +1)
for z in range(y+1)
if N == x*y + y*z + x*z]
Это снова ускорит его.
Пока вы учитесь, я рекомендую вам попробовать все это, а также свои собственные, засечь время и извлечь из этого уроки. Я также рекомендую попробовать разные похожие решения.
person
ondrejdee
schedule
04.07.2013