100에서 2000 범위에서 3으로 나눌 수있는 모든 정수를 합한 프로그램을 작성해야합니다. 시작 해야할지조차 모르겠습니다. 내가 작성한이 작은 코드는 정확하지 않습니다.range() 내의 모든 정수를 합산하십시오.
for x in range(100, 2001, 3):
print(x+x)
도움이 되었습니까?
100에서 2000 범위에서 3으로 나눌 수있는 모든 정수를 합한 프로그램을 작성해야합니다. 시작 해야할지조차 모르겠습니다. 내가 작성한이 작은 코드는 정확하지 않습니다.range() 내의 모든 정수를 합산하십시오.
for x in range(100, 2001, 3):
print(x+x)
도움이 되었습니까?
사용 발전기 표현과 여기 sum 함수 :
res = sum(x for x in range(100, 2001) if x % 3 == 0)
그것은 꽤 자명 코드 : 당신 3에서 나눌 수있는 100에서 2000까지의 모든 숫자를 합산한다.
'[]'을 삭제할 수있다. 단지 합계를 계산하기 위해 목록을 구체화 할 필요가 없다. – ThiefMaster
@ Thiefmaster 그래서리스트 생성기가 될거야, 그렇지? – aga
@ThiefMaster 목록을 구체화하지 않으면 어떤 값으로 합계가 전달됩니까? –
거기에 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으로 나누어이 범위의 첫 번째 숫자는 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
'3'은 중요하지 않지만 '시작 % 나누기! = 0 : 시작 + = 1'은 큰 '제수'에게는 좋지 않습니다. 아마'start + = (- 시작 % abs (제수))'. –
@InbarRose 내 솔루션과 시간을 단축 할 필요가 없습니다. 숫자의 일반 합계가 3 배 이상의 범위를 넘는 것보다 훨씬 빠르며, 3 개의 w/o로 나눌 수있는 숫자 만 필터링합니다. 나머지를 합산하여 합산한다. :) 당신은 우아한 해결책을 찾았습니다, +1. – aga
@InbarRose 귀하의 솔루션이 마음에 들지만, Aga의 솔루션에는 내가 사용하려고했던 루프가 포함되어 있습니다. – maku
sum(filter(lambda l : l%3 ==0, range(100,2001)))
람다 필터를 사용하지 마십시오. 대신 목록 이해/생성자 표현을 사용하는 것이 좋습니다. – ThiefMaster
나는 여기에서 람다의 새로운 장을 토론해야한다고 생각하지 않는다. 나는 그것들을 사용하는 몇 가지 이유로 람다에 관한 훌륭한 토론이 이미있다. 즉, https://mail.python.org/pipermail/python-dev/2006-February/060415.html 링크로 이동하십시오. – devil00
닫힌 수식이 있습니다.
(u_i)는 최초 용어 u_0과 공통 차분 R (u_i)의 N 제 용어 다음 합으로 정의 된 시퀀스 인 경우
이다 :EDIT : I 가지고 이 작은 video을 시각적으로 설명했습니다.
popular anecdote은 젊은 요한 칼 프리드리히 가우스에게이 공식을 부여합니다. 귀하의 경우
:
따라서 합계는 (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
"알고리즘 고안"숙제와 더 비슷한 경우, 힌트가 충분할 수 있습니다. 개별 구성 요소가 3으로 나눌 수있는 숫자로 합계되는 경우 숫자가 3으로 나눌 수 있습니다 (예 : 948은 9 + 4 + 8 = 21이 3으로 나눌 수 있기 때문에 3으로 나눌 수 있습니다. –