Python-在包括限制的范围内添加奇数?

时间:2018-10-09 19:52:06

标签: python python-3.x range

我需要编写一个程序,用户输入2个数字,然后给出该范围内所有奇数的总和 plus 用户输入的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还是很陌生任何帮助,将不胜感激。谢谢!

9 个答案:

答案 0 :(得分:2)

因此,您所缺少的就是在完成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的检查会跳过范围中的那些值,因为我们已经在开始时将它们添加了。

答案 1 :(得分:1)

只需单独检查边界。

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)

基本循环应包含任何奇数个限制,因此,如果它们是奇数,则只需添加限制。

答案 2 :(得分:1)

range(..)对象中,“上限”(第二个参数)是专有的。因此,为了解决此问题,使用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纳秒计算。迭代方法将花费线性时间,并且可能不会在合理的时间内获得结果。

答案 3 :(得分:1)

首先,我将范围扩大到y+1,然后考虑该范围内的所有赔率,在我检查xy是否相等之后,我将它们添加到清单。

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))

答案 4 :(得分:0)

我感觉好像在这里可能遗漏了一些东西-您已经将端点作为参数了,那么为什么不将它们添加为计数呢?

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)

Try it online!

此外,通过列表理解的魔力,您还可以将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)

Try it online!

答案 5 :(得分:0)

由于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)

答案 6 :(得分:0)

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

这还不够吗?

答案 7 :(得分:0)

为避免两次添加限制,您也可以使用集合。乍看之下并不简单,但是它可以使您的代码更加优雅。

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)

我坚持要明确函数名称。但这是个人的。

答案 8 :(得分:0)

也许我们可以使其更简单一些...试试

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int n = 4;
    int adjacency_matrix[][4] = {
        {0, 1, 1, 0},   //   0-->1-->3
        {0, 0, 0, 1},   //   |       ^
        {0, 0, 0, 1},   //   v       |
        {0, 0, 0, 0}    //   2-------+
    };
    int indegrees[n];
    bool visited[n];
    memset(&indegrees, 0, sizeof(*indegrees) * n);
    memset(&visited, false, sizeof(*visited) * n);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            indegrees[i] += adjacency_matrix[j][i];
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (!indegrees[j] && !visited[j]) {
                visited[j] = true;
                printf("%d ", j + 1);

                for (int k = 0; k < n; k++) {
                    if (adjacency_matrix[j][k]) {
                        adjacency_matrix[j][k] = 0;
                        indegrees[k]--;
                    }
                }

                break;
            }
        }
    }

    return 0;
}