2013-12-08 3 views
2

100에서 2000 범위에서 3으로 나눌 수있는 모든 정수를 합한 프로그램을 작성해야합니다. 시작 해야할지조차 모르겠습니다. 내가 작성한이 작은 코드는 정확하지 않습니다.range() 내의 모든 정수를 합산하십시오.

for x in range(100, 2001, 3): 
     print(x+x) 

도움이 되었습니까?

+2

"알고리즘 고안"숙제와 더 비슷한 경우, 힌트가 충분할 수 있습니다. 개별 구성 요소가 3으로 나눌 수있는 숫자로 합계되는 경우 숫자가 3으로 나눌 수 있습니다 (예 : 948은 9 + 4 + 8 = 21이 3으로 나눌 수 있기 때문에 3으로 나눌 수 있습니다. –

답변

6

사용 발전기 표현과 여기 sum 함수 :

res = sum(x for x in range(100, 2001) if x % 3 == 0) 

그것은 꽤 자명 코드 : 당신 3에서 나눌 수있는 100에서 2000까지의 모든 숫자를 합산한다.

+2

'[]'을 삭제할 수있다. 단지 합계를 계산하기 위해 목록을 구체화 할 필요가 없다. – ThiefMaster

+0

@ Thiefmaster 그래서리스트 생성기가 될거야, 그렇지? – aga

+0

@ThiefMaster 목록을 구체화하지 않으면 어떤 값으로 합계가 전달됩니까? –

0

거기에 sum function

>>> sum(filter(lambda x: x % 3 == 0, range(100, 2000))) 
664650 

입니다하지만이 뛰어난 것

>>> sum(x for x in range(100, 2000) if x % 3 == 0) 
664650 
+3

3으로 나눌 수없는 숫자를 합산하기 때문에 틀립니다. –

+1

100은 3으로 나눌 수 없기 때문에 이것은 정확하지 않습니다. – Max

+0

실제로 그런 함수가 있기 때문에 잘못되었습니다. 하지만 게시물을 편집 해 드리겠습니다, 감사합니다, 내 나쁜 – Deck

11

당신이 3으로 나누어이 범위의 첫 번째 숫자는 102입니다 알고 있기 때문에, 당신은 다음을 수행 할 수

솔루션 :

>>> sum(range(102, 2001, 3)) 
664650 

는 강력한 기능으로하려면를 :

def sum_range_divisible(start, end, divisor): 
    while start % divisor != 0: 
     start += 1 
    return sum(range(start, end, divisor)) 

를 사용 :

>>> sum_range_divisible(100, 2001, 3) 
664650 

참고 :

여기 장점은 당신이 3 각 시간을 점프하고 있기 때문에, 전체 범위에서 각 번호를 확인 할 필요가 없다는 것입니다.


타이밍 : 나는 다른 솔루션을 초과 한

, 광산 및 aga's :

>>> import timeit 
>>> timeit.Timer('sum(range(102, 2001, 3))').repeat() 
[9.516391893850312, 9.49330620765817, 9.508695564438462] 
>>> timeit.Timer('sum(x for x in range(100, 2001) if x % 3 == 0)').repeat() 
[134.757627812011, 134.46399066622394, 138.34528734198346] 

결론 :

내 대답은 배 빠르다 14

+0

'3'은 중요하지 않지만 '시작 % 나누기! = 0 : 시작 + = 1'은 큰 '제수'에게는 좋지 않습니다. 아마'start + = (- 시작 % abs (제수))'. –

+0

@InbarRose 내 솔루션과 시간을 단축 할 필요가 없습니다. 숫자의 일반 합계가 3 배 이상의 범위를 넘는 것보다 훨씬 빠르며, 3 개의 w/o로 나눌 수있는 숫자 만 필터링합니다. 나머지를 합산하여 합산한다. :) 당신은 우아한 해결책을 찾았습니다, +1. – aga

+0

@InbarRose 귀하의 솔루션이 마음에 들지만, Aga의 솔루션에는 내가 사용하려고했던 루프가 포함되어 있습니다. – maku

0
sum(filter(lambda l : l%3 ==0, range(100,2001))) 
+1

람다 필터를 사용하지 마십시오. 대신 목록 이해/생성자 표현을 사용하는 것이 좋습니다. – ThiefMaster

+0

나는 여기에서 람다의 새로운 장을 토론해야한다고 생각하지 않는다. 나는 그것들을 사용하는 몇 가지 이유로 람다에 관한 훌륭한 토론이 이미있다. 즉, https://mail.python.org/pipermail/python-dev/2006-February/060415.html 링크로 이동하십시오. – devil00

1

닫힌 수식이 있습니다.

(u_i)는 최초 용어 u_0과 공통 차분 R (u_i)의 N 제 용어 다음 합으로 정의 된 시퀀스 인 경우

이다 :

\frac{n(u_0 + u_{n-1})}{2}

EDIT : I 가지고 이 작은 video을 시각적으로 설명했습니다.

popular anecdote은 젊은 요한 칼 프리드리히 가우스에게이 공식을 부여합니다. 귀하의 경우

:

  • u_0 = 102
  • U_ {N-1} = 1,998
  • N = (1998 - 102)/3 + 1 = 633

따라서 합계는 (633 * (102 + 1998))/2 = 664650입니다.

일반적으로 range 인수 인이있는 일반적인 파이썬 함수 0 stop, step는 :

귀하의 경우
def arithmetic_series(start, stop, step): 
    number_of_terms = (stop - start) // step 
    sum_of_extrema = start + (stop - step) 
    return number_of_terms * sum_of_extrema // 2 

통화가 될 것이다 :

arithmetic_series(102, 2001, 3) 

복잡도는 O (1) 대신 그래서 당연히 O (N) 중 :

%timeit sum(range(102, 2001, 3)) 
100000 loops, best of 3: 17.7 µs per loop 

%timeit arithmetic_series(102, 2001, 3) 
1000000 loops, best of 3: 548 ns per loop 
관련 문제