Python 中从 a 到 b 的偶数之和

问题描述 投票:0回答:14

这是我的代码:

def sum_even(a, b):
    count = 0
    for i in range(a, b, 1):
        if(i % 2 == 0):
            count += [i]
        return count

我举的一个例子是 print(sum_even(3,7)) ,输出是 0。我不知道出了什么问题。

python python-3.x
14个回答
10
投票

您的缩进已关闭,应该是:

def sum_even(a, b):
    count = 0
    for i in range(a, b, 1):
        if(i % 2 == 0):
            count += i
    return count

这样

return count
就不会被限制在 for 循环中(在这种情况下,它将在第一次迭代时返回,导致它返回 0)

(并将

[i]
更改为
i


注意:另一个问题 - 您应该小心使用

range

>>> range(3,7)
[3, 4, 5, 6]

因此,如果您要致电:

  • sum_even(3,7)
  • sum_even(3,8)

现在,它们都会输出

10
,这对于 3 到 8(含)之间的偶数整数之和是不正确的。

你真正想要的可能是这个:

def sum_even(a, b):
    return sum(i for i in range(a, b + 1) if i % 2 == 0)

5
投票
  1. return
    语句移出
    for
    循环的范围(否则您将在第一次循环迭代时返回)。

  2. count += [i]
    更改为
    count += i


另外(不确定您是否知道这一点),

range(a, b, 1)
将包含从
a
b - 1
(不是
b
)的所有数字。此外,您不需要
1
参数:
range(a,b)
将具有相同的效果。因此,要包含从
a
b
的所有数字,您应该使用
range(a, b+1)

a
b
中的所有偶数相加的最快方法可能是

sum(i for i in xrange(a, b + 1) if not i % 2)

4
投票

通过正确使用 range 函数的 step 参数,您可以使其变得简单得多。

def sum_even(a, b):
    return sum(range(a + a%2, b + 1, 2))

3
投票

你不需要循环;你可以使用简单的代数:

def sum_even(a, b):
    if (a % 2 == 1):
        a += 1
    if (b % 2 == 1):
        b -= 1
    return a * (0.5 - 0.25 * a) + b * (0.25 * b + 0.5)

编辑:

正如 NPE 指出的,我上面的原始解决方案使用浮点数学。我并不太担心,因为与删除循环相比,浮点数学的开销可以忽略不计(例如,如果调用

sum_even(10, 10000)
)。此外,计算使用 2 的(负)幂,因此不应受到舍入误差的影响。

无论如何,通过将所有内容乘以 4 然后最后再除的简单技巧,我们可以在整个过程中使用整数,这是更好的选择。

def sum_even(a, b):
    if (a % 2 == 1):
        a += 1
    if (b % 2 == 1):
        b -= 1
    return (a * (2 - a) + b * (2 + b)) // 4

2
投票

我想让你看看如果 b 接近 2^32 的话你的循环是如何工作的;-) 正如马修所说,不需要循环,但他没有解释原因。

问题只是简单的算术序列wiki。此序列中所有项目的总和为:

      (a+b)  
Sn = ------- * n  
        2  

其中“a”是第一个项目,“b”是最后一个项目,“n”是项目的编号。 如果我们将“a”和“b”设为偶数,我们就可以轻松解决给定的问题。 因此,使 'a' 和 'b' 偶数只是:

if ((a & 1)==1):
    a = a + 1
if ((b & 1)==1):
    b = b - 1

现在想想两个偶数之间有多少个项目 - 它是:

    b-a
n = --- + 1
     2 

将其代入方程,可得:

      a+b       b-a 
Sn = ----- * ( ------ + 1)
       2         2

所以你的代码看起来像:

def sum_even(a,b):
    if ((a & 1)==1):
        a = a + 1
    if ((b & 1)==1):
        b = b - 1
    return ((a+b)/2) * (1+((b-a)/2))

当然你可以添加一些代码来防止a等于或大于b等。


1
投票

缩进在 Python 中很重要。您编写的代码在处理第一个项目后返回。


1
投票

这可能是使用 range 函数执行此操作的简单方法。 范围中的第三个数字是步数,即 0, 2, 4, 6...100

sum = 0
for even_number in range(0,102,2):
    sum += even_number
print (sum)

0
投票
def sum_even(a,b):
    count = 0
    for i in range(a, b):
        if(i % 2 == 0):
            count += i
     return count

这里有两个错误:

  • 添加 i 而不是 [i]
  • 您在第一次迭代时直接返回值。将返回计数移出 for 循环

0
投票

startend数字之间的所有偶数数字的(包括)。

def addEvenNumbers(start,end): total = 0 if end%2==0: for x in range(start,end): if x%2==0: total+=x return total+end else: for x in range(start,end): if x%2==0: total+=x return total print addEvenNumbers(4,12)
    

0
投票
更喜欢高级的 python 功能。

def sum(a,b): return a + b def evensum(a,b): a = reduce(sum,[x for x in range(a,b) if x %2 ==0]) return a
    

0
投票
偶数的总和,包括最小和最大数:

def sum_evens(minimum, maximum): sum=0 for i in range(minimum, maximum+1): if i%2==0: sum = sum +i i= i+1 return sum print(sum_evens(2, 6))

输出为:12

sum_evens(2, 6) -> 12 (2 + 4 + 6 = 12)


0
投票
基于列表的方法, 如果您想包含最后一个值,请使用

b+1

def sum_even(a, b): even = [x for x in range (a, b) if x%2 ==0 ] return sum(even) print(sum_even(3,6))
4

[Program finished]
    

0
投票
def sum_even_numbers(n): k = n // 2 return k * (k + 1)
要在 O(1) 中对从 1 到特定数字 𝑛 的偶数求和,您可以使用上面的代码。

从某个点开始,数字一半是偶数,一半是奇数,我们取一半偶数,并执行给出偶数的定律,直到 n*(n+1)


-1
投票
这会将 1 到 10 之间的所有偶数相加,并输出存储在变量 x 中的答案

x = 0 for i in range (1,10): if i %2 == 0: x = x+1 print(x)
    
© www.soinside.com 2019 - 2024. All rights reserved.