我需要编写一个程序,总结所有可以除以3的整数,范围是100到2000.我甚至不知道从哪里开始,到目前为止我已经得到了这一小段代码写的不正确。
for x in range(100, 2001, 3):
print(x+x)
非常感谢任何帮助!
答案 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个第一项之和为:
编辑:我已经做了这个小video来直观地解释它。
A popular anecdote将这个公式归功于年轻的约翰·卡尔·弗里德里希·高斯。
在你的情况下:
所以,总和是(633 *(102 + 1998))/ 2 = 664650。
作为一般Python函数,通常有range
个参数start
,stop
,step
:
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