Домашние задания: Информатика

Помогите с информатикой

на python
А что тут решать, применяем решето Эратосфена, да и дело с концом.
 from math import sqrt

def toindex(i: int): return i // 2 - 2

def eratosthenes(end):
prime = [True] * toindex(end)
for j in range(9, end, 6): prime[toindex(j)] = False
for i in range(5, int(sqrt(end)) + 1, 2):
if not prime[toindex(i)]: continue
for j in range(i * i, end, i * 2): prime[toindex(j)] = False
return prime

N = int(input())
if N 10000: raise ValueError("Количество чисел за пределами диапазона")
numbers = list(map(int, input().split()))
if len(numbers) != N: raise ValueError("Введено неверное количество чисел")

ISPRIME = eratosthenes(max(numbers) + 1)

def isprime(n): return (n & -2) == 2 or (n > 3 and n % 2 == 1 and ISPRIME[toindex(n)])
primes = list(filter(isprime, numbers))
print(*primes if len(primes) > 0 else [0])

Подробно:

Определяем функцию, возвращающую массив флагов, позволяющий понять, является ли простым нечётное число в интервале от 5 до переданного в функцию значения (числа до 5 и чётные числа проверяются вручную, чтобы не держать лишних флагов).

Вводим количество чисел (непонятно, зачем нужное) и сами числа. Проверяем входные данные.

Получаем флаги до максимального числа из списка.

Для наглядности определяем функцию проверки простоты: первое условие вернёт True для 2 и 3, а второе - простоту числа для чисел, больших, чем 3.

Дальше фильтруем список, оставляя только простые числа, и материализуем результат фильтрации (последнее нужно из-за нелепого условия задачи выводить 0, если простых чисел не нашлось).

Печатаем список или 0.

Конечно, алгоритм ещё оптимизировать и оптимизировать: вместо двух пробегов по списку (максимум и простота) хватило бы одного, флаги в виде списка boolean - разбазаривание памяти, и числа больше миллиарда так не проверишь (Питон не даст создать список), sqrt можно было бы подменить быстрой целочисленной аппроксимацией, цикл по числам преобразовать в цикл по индексам, но для учебной задачи важнее простота кода, так что и такая версия пойдёт.
АХ
Алексей Хаматханов
87 571
Лучший ответ
Тут надо то всего сделать небольшую достаточно простую функцию для проверки целого числа на простоту по методу Леонарда Фибоначчи (то есть простым перебором потенциальных делителей числа до √N включительно):
 def prime(n): 
if n < 2: return False
if n == 2 or n == 3: return True
if n % 2 == 0: return False
for i in range(3, int(n**0.5) + 1, 2):
if n % i == 0: return False
return True
N, A = int(input()), [int(i) for i in input().split()]
B = [a for a in A if prime(a)]
if len(B): print(*B)
else: print(0)
И не нужны здесь никакие эратосфеновские сито, которые сами по себе отнюдь не приводят ни к каким оптимальным вариантам решения данной конкретной задачи, - это всё просто дурость в чистом виде! Серьёзная оптимизация кода может действительно потребоваться только для гигантских чисел, начиная примерно с тринадцати- или четырнадцатизначных (а если программа выполняется смартфоном, то, может быть, для уже начиная с двенадцатизначных), а если таких чисел нет, то и говорить даже не о чем - и так всё прекрасно будет работать!Ещё одна нелепость - это введение значения числа N, без чего вполне можно обойтись, так как компьютер и так будет знать сколько и чего в него ввелось при вводе данных.
пайтон изучай пригодится
ПП
Пётр Перов
2 158
Владимир Барабанов буду изучать, но помогите с решением