Ускорить код:
n = int(input())
i = 1
z = 1
spisok = []
a = []
while i <= n:
while z <= i:
if i % z == 0:
a.append(z)
z += 1
if len(a) % 2 == 0:
spisok.append(i)
a = []
z = 1
i += 1
print(len(spisok))
i = 1
z = 1
spisok = []
a = []
while i <= n:
while z <= i:
if i % z == 0:
a.append(z)
z += 1
if len(a) % 2 == 0:
spisok.append(i)
a = []
z = 1
i += 1
print(len(spisok))
i = 1
z = 1
spisok = []
a = []
while i <= n:
----while z <= i:
--------if i % z == 0:
------------a.append(z)
--------z += 1
----if len(a) % 2 == 0:
--------spisok.append(i)
----a = []
----z = 1
----i += 1
print(len(spisok))
Ответы
import array
spisok = array.array('I') # Массив положительных чисел.
for i in range(int(input())):
if not len([0 for z in range(1, i + 1) if not i % z]) % 2: spisok.append(i)
# not len(...) % 2 тоже что и len(...) % 2 == 0, но быстрее в 2 раза.
# [0 for z in ...] поскольку z нам не нужен, нам нужна лишь длина, я заменил его 0-ом.
print(len(spisok))
Или
Есть способ, ускорить код в 20 раз, cython.
from cpython.array cimport array
n = int(input()) + 1
spisok = array('I')
cdef unsigned int i, z
for i in range(n):
if not len([0 for z in range(1, i + 1) if not i % z]) % 2: spisok.append(i)
print(len(spisok))
Сохранишь этот код в файл с расширением pyx (например my_file.pyx)
В консоли введёшь команду:
pip install cython # библиотека
cythonize -i my_file.pyx || py -m cythonize -i main.pyx
И создай любой .py файл, добавь туда import того файла:
import my_file
n = int(input()) + 1
spisok = array('I')
cdef unsigned int i, z
for i in range(n):
----if not len([0 for z in range(1, i + 1) if not i % z]) % 2: spisok.append(i)
print(len(spisok))
В консоли введёшь команду:
pip install cython
cythonize -i main.pyx
## ^^ language_level=3 указывает на то, что это Python3 (тоже + к скорости)
from cpython.array cimport array
cdef unsigned int i, z, ZERO, n # unsigned int - это только положительные числа.
cdef int _n = int(input('> ')) # Поскольку n не может быть меньше нуля, я сначала это проверяю...
n = abs(_n) if _n < 0 else _n # и если он меньше нуля, убераю его (|n|)
spisok = array('I')
for i in range(1, n + 1):
if not len([ZERO for z in range(1, i + 1) if not i % z]) % 2: spisok.append(i)
print(spisok.__len__())
# как оказалось, вызов len(spisok) значительно медленнее spisok.__len__()