Python - добавление нечетных чисел в диапазоне, включая пределы? - PullRequest
0 голосов
/ 09 октября 2018

Мне нужно написать программу, в которой пользователь вводит 2 числа, а затем дает сумму всех нечетных чисел в этом диапазоне плюс 2 числа, которые ввел пользователь.Я много искал, но не нашел ничего, что включало бы ограничения.Пока что у меня есть:

x=int(input('Enter first number: '))
y=int(input('Enter second number: '))

def SumOdds(x,y):
  count=0
  for i in range(x,y):
     if (int(i%2==1)):
        count=count+i

  print(count)
SumOdds(x,y)

Это дает сумму шансов, но не включает пределы.Например, скажем, я поставил 10 и 20. Это дает мне 75, но нужно добавить 10 и 20, чтобы сделать 105. Я уверен, что это простое исправление, но я очень плохо знаком с Python, поэтомулюбая помощь будет оценена.Спасибо!

Ответы [ 8 ]

0 голосов
/ 13 марта 2019

Чтобы не добавлять ограничения дважды, вы также можете использовать наборы.На первый взгляд это не просто, но это может сделать ваш код более элегантным.

x=int(input('Enter first number: '))
y=int(input('Enter second number: '))

def sum_odds_and_limits(x,y):
    to_sum = set() #sets are collections of unique elements
    to_sum |= {x,y} #union
    for num in range(x,y+1):
        if num%2==1 :
            to_sum|={num}
    print(sum(to_sum))

sum_odds_and_limits(x,y)

И для эффективности я предлагаю вам избегать модулей (%) и условий в цикле.нотация срезов - отличный инструмент в python, чтобы сделать это:

range(x,y+1)[(x+1)%2::2]
#list()[<start position>:<ending position>:<take every N element>]

И в итоге вы получите такой код:

x=int(input('Enter first number: '))
y=int(input('Enter second number: '))

def sum_odds_and_limits(x,y):
    #sum all the odd numbers and boundaries in the given range
    to_sum = set(range(x,y+1)[(x+1)%2::2])
    to_sum |= {x,y}
    print(sum(to_sum))

sum_odds_and_limits(x,y)

Я настаиваю на том, чтобы имена функций были понятными.Но это личное.

0 голосов
/ 09 октября 2018

Вы должны расширить второе число вашего диапазона на единицу из-за того, как работают диапазоны Python (первое число включено и последнее число исключено).Затем вычислите сумму нечетных чисел, как у вас, и в конце просто добавьте два введенных числа к сумме нечетных чисел.Для этого вы можете создать новую переменную (как я покажу ниже) или добавить ее в переменную суммы нечетных чисел.

x1=int(input('Enter first number: '))
x2=int(input('Enter second number: '))

def sum_odds(x1, x2):
    odd_sum = 0
    total_sum = 0
    for number in range(x1, x2+1):
        if number % 2 != 0:
            odd_sum+=number
    total_sum = odd_sum + x1 + x2
    print(total_sum)

    return total_sum

sum_odds(x1,x2)
0 голосов
/ 27 октября 2018

sum([i for i in range(x, y+1) if not i%2==0])

Разве этого недостаточно?

0 голосов
/ 09 октября 2018

Мне кажется, что я здесь что-то упускаю - вы уже принимаете конечные точки в качестве аргументов, так почему бы не добавить их в счет?

x=int(input('Enter first number: '))
print x
y=int(input('Enter second number: '))
print y

def SumOdds(x,y):
  count = x + y

  # x + 1 for an exclusive range, i.e (10, 20) will check the numbers 11-19
  for i in range(x+1, y):
     if (int(i % 2 ==1 )):
        count= count + i

  print(count)
SumOdds(x,y)

Попробуйте это онлайн!

Кроме того, с помощью магии понимания списка вы можете уменьшить цикл for до одной строки, если хотите:

x=int(input('Enter first number: '))
y=int(input('Enter second number: '))

def SumOdds(x,y):
  # x + y + each i in range 11-19, if i is odd
  count = x + y + sum(i for i in range(x+1, y) if i % 2 == 1)
  print(count)
SumOdds(x,y)

Попробуйте онлайн!

0 голосов
/ 09 октября 2018

Сначала я расширил бы диапазон до y+1, затем взял бы все шансы в этом диапазоне, после того как я бы проверил, были ли x и y, даже если так, я бы добавил их в список.

x = int(input('Enter first number: '))
y = int(input('Enter second number: '))
tot = [i for i in range(x, y+1) if i % 2]

if not x % 2:
    tot.append(x)

if not y % 2:
    tot.append(y)

print(sum(tot))
0 голосов
/ 09 октября 2018

В объекте 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 наносекунды.Итеративный подход займет линейное время и, вероятно, не даст результата в течение разумного времени.

0 голосов
/ 09 октября 2018

Просто проверьте границы отдельно.

x=int(input('Enter first number: '))
y=int(input('Enter second number: '))

def SumOdds(x,y):
  count=0
  for i in range(x,y):
    if (int(i%2==1)):
      count=count+i
  if(x%2==0):
    count= count+x
  if(y%2==0):
    count= count+7
  print(count)
SumOdds(x,y)

Базовый цикл должен включать любые нечетные ограничения, поэтому вам нужно только добавлять ограничения, если они нечетные.

0 голосов
/ 09 октября 2018

Итак, все, что вам не хватает - это добавление двух ваших чисел, когда вы закончите цикл for.Попробуйте это:

x=int(input('Enter first number: '))
y=int(input('Enter second number: '))

def SumOdds(x,y+1):
  count= x + y #notice instead of 0, it's the sum now!
  for i in range(x,y):
     if(i == x or i == y):
         pass
     elif (int(i%2==1)):
        count=count+i

  print(count)
SumOdds(x,y)

Редактировать: согласно вашему комментарию, вы не захотите добавлять свои лимиты дважды, если они нечетные.y+1 гарантирует, что вы захватываете весь диапазон, а проверка для i == x or i == y пропускает эти значения в диапазоне, так как мы уже добавили их в начале.

...