def get_redundants_sum(redundants: list, limit: int):
redundants_set = set(redundants)
arr = []
for i in range(1, limit): # перебор от 1 до 28124
if all(i - j not in redundants_set for j in redundants): # если i - j нет в reduants_set добавляем
arr.append(i)
return sum(arr)
def solve_by_set(abundants: list, limit: int):
abundants_set = set(abundants)
return sum(i for i in range(1, limit) if all(i - j not in abundants_set for j in abundants))
from time import time, sleep
def timer(f):
def wrapper(*args, **kwargs):
t, res = time(), f(*args, **kwargs)
print(f"{f.__name__}, sec: {time() - t:f}")
return res
return wrapper
@timer
def get_redundant_nums(limit: int):
dividers = [1] * limit
for i in range(2, limit // 2 + 1):
for j in range(i * 2, limit, i):
dividers[j] += i
redundant_nums = []
dividers[0] = 0
for i, s in enumerate(dividers):
if i < s:
redundant_nums.append(i)
return redundant_nums
@timer
def get_redundants_sum(redundants: list, limit: int):
redundants_set = set(redundants)
return sum(i for i in range(1, limit) if all(i - j not in redundants_set for j in redundants))
@timer
def final(limit: int):
return get_redundants_sum(get_redundant_nums(limit), limit)
print(final(50))
get_redundant_nums, sec: 0.000000
get_redundants_sum, sec: 0.000000
final, sec: 0.001018
def get_izb(N: int):
sum_of_dividers = [1] * N
for i in range(2, N // 2 + 1):
for j in range(i * 2, N, i):
sum_of_dividers[j] += i
others = []
sum_of_dividers[0] = 0
for i, s in enumerate(sum_of_dividers):
if i < s:
others.append(i)
return others
def get_sum(arr: dict, N: int):
summ = []
all_nums = list(range(N))
for f in arr:
for s in arr:
s = f + s
if s > N:
break
summ.append(s)
lst = [o for o in all_nums if o not in summ]
return sum(lst)
def final(N: int):
return get_sum(get_izb(N), N)
f = '''def final(N):
sum_of_dividers = [1] * N # все числа делятся на 1, проходили уже
for i in range(2, N // 2 + 1): # начнем делители с двойки
for j in range(i * 2, N, i): # ко всем ячейкам с адресом,
# кратным i но большим, чем i,
sum_of_dividers[j] += i
result = list(range(N)) # изначально все числа - кандидаты в нераскладываемые
others = [] # здесь будем копить варианты второго слагаемого
sum_of_dividers[0] = 0 # заглушим чтоб ноль не пролазил через if i < s
for i, s in enumerate(sum_of_dividers):
if i < s: # i избыточное
others.append(i) # случай i + i должен быть учтен в этом же цикле
for j in others:
j += i
if j >= N: # выход за пределы диапазона
break # в others числа по нарастающей, остальные заведомо больше
result[j] = 0
'''
def measure_time(function: str):
elapsed_time = timeit.timeit(function, number=100)/100
print(elapsed_time)
measure_time(f)