def izb(n:int):
delt = []
for i in range(1,n):
if n % i == 0:
delt.append(i)
else:
if sum(delt) > n:
return True
else:
return False
def allizb():
all_izb = []
for i in range(12,28124):
if izb(i) == True:
all_izb.append(i)
else:
return all_izb
alizb = allizb()
i = 1
otv = []
for i in range(12,28124):
for g in alizb:
for h in alizb:
if i != (g+h):
otv.append(i)
print(i)
else:
print( sum(otv ))
def izb(n:int): #функция для определения является число избыточным или нет
delt = [] # массив куда будут помещаться все делители числа n
for i in range(1,n):
if n % i == 0:
delt.append(i) #добавления делителя в массив
else:
if sum(delt) > n: #если сумма делителей больше самого числа то это избыточное числа то есть выводим True
return True
else:
return False
def allizb(): #функция в которой я получаю все избыточные числа до 28124(от 12 потому что по условию это самое маленькое избыточное число)
all_izb = []
for i in range(12,28124): #если число избыточное добавляю в массив, в конце верну массив со всеми числами
if izb(i) == True:
all_izb.append(i)
else:
return all_izb
alizb = allizb()
i = 1
otv = [] #массив куда буду вносить числа которые не могут быть суммой двух избыточных чисел
for i in range(12,28124):
for g in alizb:
for h in alizb:
if i != (g+h): #если i не равна сумме 2 избыточных чисел из массива то добавляем
otv.append(i)
print(i)
else:
print( sum(otv )) # в конце выводим сумму всех чисел
def izb(n:int): #функция для определения является число избыточным или нет
delt = [] # массив куда будут помещаться все делители числа n
for i in range(1,n):
if n % i == 0:
delt.append(i) #добавления делителя в массив
else:
if sum(delt) > n: #если сумма делителей больше самого числа то это избыточное числа то есть выводим True
return True
else:
return False
sum(delt) > n
возвращает логическое значение и может быть передано напрямую в оператор return. Перепишите. def simple(n):
lst=[2]
for i in range(3, n+1, 2):
if (i > 10) and (i%10==5):
continue
for j in lst:
if j*j-1 > i:
lst.append(i)
break
if (i % j == 0):
break
else:
lst.append(i)
if max(lst) == n:
return True
else:
return False
simple = [i for i in range((2*10**6) + 1) if simple(i) == True]
print(simple)
N = 50 # для наглядности возьмём небольшое 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 # прибавим делитель i
for i in range(2, N):
print(i, sum_of_dividers[i], '' if sum_of_dividers[i] <= i else 'избыточное')
n = 30 # число, до которого хотим найти простые числа
numbers = list(range(2, n + 1))
for number in numbers:
if number != 0:
for candidate in range(2 * number, n+1, number):
numbers[candidate-2] = 0
print(*list(filter(lambda x: x != 0, numbers)))
def allizb(): #функция в которой я получаю все избыточные числа до 28124(от 12 потому что по условию это самое маленькое избыточное число)
all_izb = []
for i in range(12,28124): #если число избыточное добавляю в массив, в конце верну массив со всеми числами
if izb(i) == True:
all_izb.append(i)
else:
return all_izb
i = 1
otv = [] #массив куда буду вносить числа которые не могут быть суммой двух избыточных чисел
for i in range(12,28124):
for g in alizb:
for h in alizb:
if i != (g+h): #если i не равна сумме 2 избыточных чисел из массива то добавляем
otv.append(i)
print(i)
else:
print( sum(otv )) # в конце выводим сумму всех чисел
def c(): #получится массив с суммами избыточных чисел
otv = []
for f in alizb:
for s in alizb:
otv.append(f+s)
return otv
arr = []
for i in range(12,28124):
if i not in c(): # если i там нет то добавить
arr.append(i)
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
return sum(result)
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)
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 slow_func(t):
sleep(t)
return 'I`m finish!'
print(slow_func(1))
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)
def solve_by_set(abundants, lim):
abundants_set = set(abundants)
return sum(i for i in range(1, lim) 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
@timer
def get_abundants(limit: int):
dividers = [1] * limit
for i in range(2, limit // 2 + 1):
for j in range(i * 2, limit, i):
dividers[j] += i
return [i for i in range(12, limit) if i < dividers[i]]
@timer
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))
N = 28124
Abundants = get_abundants(N) # тут имеем время первого этапа
print(solve_by_set(Abundants, N)) # тут время второго и результат
@timer
def solve_by_product(abundants, lim):
result = list(range(lim)) # изначально все числа - кандидаты в нераскладываемые
others = [] # здесь будем копить варианты второго слагаемого
for i in abundants:
others.append(i) # случай i + i должен быть учтен в этом же цикле
for j in others:
j += i
if j >= lim: # выход за пределы диапазона
break # в others числа по нарастающей, остальные заведомо больше
result[j] = 0
return sum(result)
print(solve_by_product(Abundants, N)) # тут время второго и результат
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))
@timer
def solve_by_product(abundants, lim):
result = list(range(lim))
for i in abundants:
for j in abundants:
if i + j < lim:
result[i + j] = 0
return sum(result)
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)
res = cnt = 0 # res будет 4179871, а cnt - посмотрим
for i in range(1, limit): # для каждого i из диапазона 1..N
for j in abundants: # для каждого j из избыточных
cnt += 1 # мы же считаем сколько нужно элементарных операций
if i - j in abundants_set: # если есть избыточное, дополняющие j до i
break # хватит!
else: # а если не случилось брейка
res += i # значит не случилось
return res, cnt
print(*solve_by_set(Abundants, N))