2012-10-11 4 views
9

모든 숫자 n의 합계를 계산하는 함수를 작성해야합니다.모든 숫자의 합

Row 1:   1 
Row 2:   2 3 
Row 3:  4 5 6 
Row 4:  7 8 9 10 
Row 5:  11 12 13 14 15 
Row 6: 16 17 18 19 20 21 

위의 행을 '숫자 삼각형'으로 상상해보십시오. 이 함수는 사용할 숫자뿐만 아니라 숫자를 나타내는 숫자 n을 취해야합니다. 행 5의 합은 65입니다. n 값에 대해이 계산을 수행하는 함수를 어떻게 얻을 수 있습니까?

명확성을 위해 숙제가 아닙니다. 최근 중간 고사를하고 있었고 말할 것도없이 나는 곤두박질 쳤습니다.

+4

힌트 : 각 행의 가장 왼쪽 숫자의 규칙을 참조? 1,2,4,7,11,16, ... – Junuxx

+1

http://oeis.org/A006003 – OrangeDog

답변

14

열 5의 가장 왼쪽 숫자는 11 = (4+3+2+1)+1이고 이는 sum(range(5))+1입니다. 이는 일반적으로 n에 해당합니다. 그래서

:

def triangle_sum(n): 
    start = n*(n-1)//2+1 
    return sum(range(start,start+n)) 
+1

두 번째 버전이 실제로는 약간 * 덜 * 우아하지만 약간 * 더 효율적이라고 말하고 싶습니다. – fletom

+0

+1 좋은 해결책. –

2

숫자 1, 3, 6, 10 등은 삼각형 숫자이고 명확한 진행이 있습니다. 단순히 두 개의 경계 삼각형 수를 계산하고 range()을 사용하여 두 삼각형 수의 해당 행에있는 숫자를 얻고 sum()을 얻습니다.

0
def sum_row(n): 
    final = n*(n+1)/2 
    start = final - n 
    return final*(final+1)/2 - start*(start+1)/2 
: n*(n-1)//2 그래서이가 조금이라도 더 우아하게 할 수 있기 때문에 사람들의 무리에 의해 언급 한 바와 같이

def triangle_sum(n): 
    start = sum(range(n))+1 
    return sum(range(start,start+n)) 

, 당신은 분석적 sum(range(n))을 표현할 수

또는 어쩌면

작동합니까 어떻게
def sum_row(n): 
    final = n*(n+1)/2 
    return sum((final - i) for i in range(n)) 

:

함수가하는 첫 번째 일은 각 행의 마지막 수를 계산하는 것입니다. n = 5 인 경우 15를 반환합니다. 왜 작동합니까? 각 행마다 오른쪽의 숫자를 행 번호만큼 증가시킵니다. 처음에는 1을가집니다. 1 + 2 = 3; 3 + 3 = 6; 그런 다음 6 + 4 = 10, ecc. 이 공식은 당신이 단순히 1 + 2 + 3 + .. + n을 계산하는 것으로 유명한 공식에 대해 n (n + 1)/2와 같습니다.

마지막으로 최종 숫자를 합계 할 수 있습니다. - 루프는 간단합니다 (목록 작성은 간단합니다). 또는 1에서 최종까지 모든 숫자를 합친 다음 합계를 뺍니다. 표시된 수식에서와 같이 1에서 최종 - n까지의 숫자; 당신은 몇 가지 수학 연산과 더 잘 할 수

0

여기에 일반적인 솔루션입니다 :

start=1 
n=5 
for i in range(n): 
    start += len (range(i)) 
answer=sum(range(start,start+n)) 

기능으로는 :

def trio(n): 
    start=1 
    for i in range(n): 
      start += len (range(i)) 
    answer=sum(range(start,start+n)) 
    return answer 
4

방정식을 사용하지만 해결책 일 자사의 비트 그 방정식에 도달한다.

def sumRow(n): 
    return (n**3+n)/2 
+1

내가 생각할 수있는 가장 좋은 이유는 –

+0

입니다. 'int ** 아이디어로 돌아가는 전환이 필요 없다고 생각합니다. n ** 3과 n은 항상 같은 패리티를 가지므로 그 합은 항상 짝수입니다. 대신 단순히'return (n ** 3 + n)/2'을 대신 할 수 있습니다. – elias

+0

@elias 나는 당신이 옳다고 믿습니다. 왜 내가 처음 두 배로 전환해야한다고 생각하는지 모르겠다. – Matt

0
def compute(n): 
    first = n * (n - 1)/2 + 1 
    last = first + n - 1 
    return sum(xrange(first, last + 1))