Поскольку вы знаете, что первое число в этом диапазоне, который делится на 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]
Вывод:
Мой ответ быстрее фактор
В случае, если это больше похоже на домашнее задание «изобретать алгоритм», может быть достаточно намека: число делится на три в случае, если отдельные компоненты компонентов суммируются до числа, делящегося на три (например, 948 делится на три, потому что 9 + 4 + 8 = 21, которое делится на три и т. Д. И т. Д.). –