求和范围内的所有整数()

时间:2013-12-08 16:47:19

标签: python python-3.x

我需要编写一个程序,总结所有可以除以3的整数,范围是100到2000.我甚至不知道从哪里开始,到目前为止我已经得到了这一小段代码写的不正确。

for x in range(100, 2001, 3):
      print(x+x)

非常感谢任何帮助!

6 个答案:

答案 0 :(得分:12)

由于您知道此范围内可被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

答案 1 :(得分:7)

在这里使用生成器表达式和求和函数:

res = sum(x for x in range(100, 2001) if x % 3 == 0)

这是一个非常自我解释的代码:你将所有数字从100到2000(包括100和2000)相加,可以被3整除。

答案 2 :(得分:1)

有一个封闭的公式。

如果(u_i)是由其第一项u_0定义的序列及其公共差r,则(u_i)的n个第一项之和为:

\frac{n(u_0 + u_{n-1})}{2}

编辑:我已经做了这个小video来直观地解释它。

A popular anecdote将这个公式归功于年轻的约翰·卡尔·弗里德里希·高斯。

在你的情况下:

  • u_0 = 102
  • u_ {n-1} = 1998
  • n =(1998 - 102)/ 3 + 1 = 633

所以,总和是(633 *(102 + 1998))/ 2 = 664650。

作为一般Python函数,通常有range个参数startstopstep

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 :(得分:0)

有一个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

答案 4 :(得分:0)

sum(filter(lambda l : l%3 ==0, range(100,2001)))

答案 5 :(得分:0)

让我们以递归的方式进行操作。

使用range_sum函数

def range_sum(array):
if array[0]==array[1]:
    return array[0]
else:
    return range_sum([array[0],array[1]-1])+array[1]
range=[1,4]
print(range_sum(range))

10