В объекте range(..)
«верхняя граница» (второй параметр) равна exclusive .Таким образом, чтобы исправить это, достаточно использовать range(x, y+1)
, например:
def SumOdds(x, y):
count=0
for i in range(x, y+1):
if i%2==1:
count=count+i
print(count)
SumOdds(x,y)
Обратите внимание, что мы можем улучшить скорость, поскольку сумму можно рассчитать по формуле:
n
---
\ 2 2
/ 2*i + 1 = (n+1) - m
---
i=m
Таким образом, мы можем рассчитать это следующим образом:
def sumOdds(x, y):
m = x//2
n1 = ((y-1)//2)+1
print(max(0, n1*n1 - m*m))
Преимущество этого подхода в том, что он работает в O (1) для небольших и не очень маленьких чисел, а в O (log m + log n) для больших чисел (поскольку умножение может занять больше времени).
В результате мы можем довольно быстро вычислить сумму огромных чисел, например:
>>> timeit.timeit(lambda: SumOdds(12345678901234567890, 98765432109876543210), number=1000000)
0.5030524220055668
Таким образом, вычисление суммы нечетных элементов между 12'345'678'901'234'567'890 и 98'765'432'109'876'543'210 можно рассчитать за 503 наносекунды.Итеративный подход займет линейное время и, вероятно, не даст результата в течение разумного времени.