2012-11-04 4 views
7

저는 방금 파이썬을 배우기 시작했고 기술을 향상시키는 데 도움이되는 몇 가지 문제를 시작했지만이 질문에 상당히 매달 렸습니다.제곱이 두 개의 사각형의 합인 숫자 목록

정사각형이 두 개의 제곱의 합으로 표현 될 수있는 1000까지의 모든 양의 정수를 포함하는 목록을 만듭니다 (즉, p^2 = m^2 + n^2 인 정수 p, 여기서 m n은 0보다 큰 정수임).

힌트 : 몇 가지 접근법이 있습니다. 모든 사각 숫자 목록을 작성하는 것이 도움이 될 수 있습니다. in 연산자가 유용 할 수 있습니다. 여기

내가 지금까지 가지고 올 한 코드입니다 :

numbers=xrange(1001) 
    numbers_squared=[x**2 for x in numbers] 
    a=[] 

    for x in numbers_squared: 
     for b in numbers_squared: 
      if (x+b)**.5 <= 1001: 
       a.append(x+b) 
    print a 

나는이 함께 얻을 문제는 파이썬 내가 10 분을 기다렸다 (이러한 계산을 할 수 년이 걸리는이며 아직 번호 인쇄). 이 문제를 해결하는 방법에 대한 모든 힌트는 매우 높이 평가 될 것입니다.

p.s. 요점은 목록을 사용하는 것입니다. 또한 힌트는 솔루션 자체보다 더 높이 평가 될 것입니다.

감사합니다!

+0

음, 두 번째 for 루프를 x 이하의 숫자로 제한 할 수 있습니다. '8 ** 2 = 64'는 '64'보다 큰 숫자의 합으로 표현 될 수 없습니다. –

+0

숫자가 몇 개인 지 알려 주시겠습니까? – inspectorG4dget

+0

필자는 그렇게 생각했지만 파이썬에서 정확히 어떻게 작성해야할지 확신하지 못했습니다. 힌트를 주셔서 감사합니다 : D – Dizzle

답변

2

방법 지능형리스트에 대한 작동 알려줘?

x = [(a,b,c) for c in range(1,1001) for b in range(1, c) for a in range(1,b) if a**2+b**2==c**2] 
print x 

I이를 초과하고있다 : 범위에 대한 (1, b)

다음과 같이 (C 1) 내지 B의 범위 (1,1011)에서 C 대해 계산 컴퓨터에서 완료하는 데 46 초가 걸립니다.

7

우선, 문제를 해결하지 않고 있습니다. (x+b)**.5이 실제로 정수인지 확인해야합니다. 둘째, 숫자를 인쇄하는 경우 이미 모든 숫자를 계산 한 것입니다. 위 단계를 수행하면이 단계에 필요한 시간이 단축됩니다.

+0

Ahh okay. 고맙습니다. D, 나는 그것을 깨뜨 렸습니다! – Dizzle

+0

이것은 기본적으로 피타그리아의 3 배수를 찾는 문제입니다. 단지'c'를'a ** 2 + b ** 2 = c ** 2'로 유지하십시오. – Droogans

1

이 작동 할 수 있습니다 :

def isSumOfSquares(n): 
    """return True if n can be expressed as the sum of two squares; False otherwise""" 

    for a in xrange(1,n): 
     b = n-(a**2) 
     if b<=0: 
      return False 
     elif not math.sqrt(b)%1: 
      return True 
    return False 

answer = [i for i in xrange(1,1001) if isSumOfSquares(i**2)] 

이 당신

+0

나는 그것을 시도하고 그것은 작동하지 않았다, 수정하고 여전히 아니 몇 가지 변경하려고했습니다. 어쨌든 고마워요. – Dizzle

+0

[1, 1000]에 567 개의 항목이 있습니다.당신이 작동하지 않는 것에 대해 더 구체적으로 설명 할 수 있다면, 나는 그것을 시도하고 고칠 수있다. – inspectorG4dget

0

다른 곳에서는 answered this입니다.

import math 

def is_triple(hypotenuse): 
    """return (a, b, c) if Pythagrean Triple, else None""" 
    if hypotenuse < 4: 
     return None 

    c = hypotenuse ** 2 

    for a in xrange(3, hypotenuse): 
     b = math.sqrt(c - (a ** 2)) 
     if b == int(b): 
      return a, int(b), hypotenuse 

    return None 

>>> results = [x for x in range(1001) if is_triple(x)] 
>>> len(results) 
567 

거의 즉시 실행됩니다.

+0

나는 당신의 구현 속도에 매우 감명 받았지만, 단지 한 가지 해결책이 뻔뻔 스럽기 때문에 최종 목록은 전체보다 작다. (15, 20, 25)와 (7, 24, 25)의 두 가지 해법이 있기 때문에 내 목록 이해력은 881이다. 왜냐하면 a jcr

+1

OP의 제목은 약간 오도 할 수 있습니다 : * 두 제곱의 합계 인 숫자 목록 * 내가 읽은 것과 비교 : * * * 두 개의 사각형의 합계 * – Droogans

관련 문제