Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/505: Рейтинг темы: голосов - 505, средняя оценка - 4.82
-27 / 13 / 0
Регистрация: 29.12.2018
Сообщений: 214

Решето Эратосфена

15.01.2019, 19:51. Показов 103338. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В 235 году до н.э. греческий ученый Эратосфен изобрел следующий способ нахождения простых чисел на промежутке от 1 до заданного N:

1. Выписать все целые числа 2,...,N.

2. Зачеркнуть все числа, кратные i = 2 — первому простому числу.

3. Найти первое незачёркнутое число в списке, большее чем i, и присвоить значению переменной i это число.

4. Повторять шаги 2 и 3, пока это возможно.

После завершения алгоритма незачеркнутыми останутся все простые числа, меньшие либо равные N.

Напишите функцию eratosthenes(N), воспроизводящую данный алгоритм. Ваша функция должна через пробел печатать числа в том порядке, в котором их вычеркивает из списка оригинальный алгоритм. Например, если N = 10, то числа будут вычеркиваться в таком порядке: 4 6 8 10 9.

Если для какого-то параметра никакие числа не вычеркиваются, просто не выводите ничего.

Пример
Ввод
eratosthenes(15)
Вывод
4 6 8 10 12 14 9 15
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2019, 19:51
Ответы с готовыми решениями:

Решето Эратосфена
n = int(input()) a = * n a = a = False for k in range(2, n): if a: for m in (k + k, n, k): a = False ...

Решето Эратосфена
Как реализовать алгоритм "Решето Эратосфена" для поиска простых чисел не больших N ? Ввод: 23 Вывод: Код: n=int(input()) l= ...

Решето Эратосфена
**Предисловие** *Для нахождения всех простых чисел не больше заданного числа n, следуя методу Эратосфена, нужно выполнить следующие шаги:...

15
338 / 127 / 114
Регистрация: 09.04.2011
Сообщений: 246
16.01.2019, 00:03
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def eratosthenes(n):
    a = []
    b = []
 
    if n < 4:
        return
    
    for i in range(2,n+1,1):
        a.append(i)
        
    while a:
        for i in a[1:]:
            if i % a[0] == 0:
                b.append(i)
                a.remove(i)
        a = a[1:]
 
    for i in b:
        print(i,end=" ")
    
 
eratosthenes(15)
0
Эксперт Python
1356 / 653 / 207
Регистрация: 23.03.2014
Сообщений: 3,057
16.01.2019, 00:09
JduNona, может так?:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
n = int(input("вывод простых чисел до числа ... "))
a = [0] * n  # создание массива с n количеством элементов
for i in range(n):  # заполнение массива ...
    a[i] = i  # значениями от 0 до n-1
 
# вторым элементом является единица, которую не считают простым числом
# забиваем ее нулем.
a[1] = 0
 
m = 2  # замена на 0 начинается с 3-го элемента (первые два уже нули)
while m < n:  # перебор всех элементов до заданного числа
    if a[m] != 0:  # если он не равен нулю, то
        j = m * 2  # увеличить в два раза (текущий элемент простое число)
        while j < n:
            a[j] = 0  # заменить на 0
            j = j + m  # перейти в позицию на m больше
    m += 1
 
# вывод простых чисел на экран (может быть реализован как угодно)
b = []
for i in a:
    if a[i] != 0:
        b.append(a[i])
 
del a
print(b)
Добавлено через 4 минуты
Классический вариант, все-таки, как я понимаю).
1
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
16.01.2019, 06:02
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Еще один вариант решения, с использованием генератора списков.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def eratosthenes(n):
    # Среди чисел, меньших 4, не будет вычеркнутых.
    if n < 4:
        return
    
    # Создание и заполнение списка чисел из интервала [0; n].
    a = [i for i in range(n + 1)]
    # Число 1 не является простым числом.
    # Все числа, не являющиеся простыми, будем вычеркивать (заменять нулём).
    a[1] = 0
    # Список вычеркнутых чисел пока пуст.
    b = []
 
    # Перебор всех чисел от 2 до n.
    for i in range(2, n + 1):
        # Перебрать все кратные ему числа <= n.
        for j in range(i * 2, n + 1, i):
            # Если число еще не вычеркнуто.
            if a[j] != 0:
                # Вычеркнуть это число.
                a[j] = 0
                # Поместить в список вычеркнутых.
                b.append(j)
 
    # Вывести составные числа в порядке их вычеркивания.
    print(" ".join(str(x) for x in b))
 
eratosthenes(int(input('Максимальное число n = ')))
1
13 / 3 / 3
Регистрация: 27.12.2018
Сообщений: 39
16.01.2019, 06:45
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Вот мой вариант)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def eratosthenes(N):
    a = [i for i in range(1, N+1)] #тут будут простые числа
    b = [] #тут будут вычеркнутые
    num=2 #простое число которое будет проверяться, то есть 2, 3, 5...
    i=0 #для подсчёта(счётчик)
    a.remove(1) #еденица - не простое число
    
    while num < a[-1]: #цикл, пока num меньше последнего числа в списке a
        while len(a) > i: #цикл, пока длина a больше i, то естьэто цикл, который проходит по списку в поисках чисел кратных num и удаляет их
            if a[i]%num == 0 and a[i]!= num: #если остаток от числа в списке на позиции i равен нулю - заносим в список удалённых(b), удаляем из a
                b.append(a[i]) #заносим
                a.pop(i) #удаляем
            i+=1 #проверяем следущую позицию списка
        i=0 #сбрасываем счётчик
 
        #следущее число num
        for j in range(len(a)):
            if a[j] > num:
                num = a[j]
                break
 
    return b
#print(eratosthenes(int(input())))
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,696
Записей в блоге: 14
16.01.2019, 07:48
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def eratosthenes(n):
    arr=list(range(n+1))
    p=1
    while(True):
        f=0
        j=2
        while(j<=n):
            if (arr[j] != 0) & (arr[j] > p) :
                p=arr[j] 
                i=j+1
                while(i<=n):
                    if (arr[i] != 0) & (arr[i]%p==0):
                        print(arr[i],end=' ')
                        arr[i]=0
                        f=1        
                    i += 1
            j += 1
        if (f==0):
            break
https://ideone.com/x0B2cd
1
3 / 3 / 0
Регистрация: 13.03.2019
Сообщений: 4
14.03.2019, 00:11
Зачем хранить вычеркнутые и не вычеркнутые, вас просят просто их вывести в правильном порядке
Python
1
2
3
4
5
6
7
8
9
10
11
def eratosthenes(N):
    array_of_integers = [i for i in range(3, N + 1)]
    i = 2
    while len(array_of_integers) != 0:
        for j in array_of_integers:
            if j % i == 0:
                print(array_of_integers[array_of_integers.index(j)], end=' ')
                del array_of_integers[array_of_integers.index(j)]
 
        i = array_of_integers[0]
        del array_of_integers[0]
2
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 41
28.09.2019, 19:39
Python
1
[i for i in range(1000) if i%2!=0 and i%3!=0 and i%5!=0 and i%7!=0 and i%9!=0]
это без первых из 10
0
2 / 2 / 0
Регистрация: 16.02.2020
Сообщений: 3
25.04.2020, 15:39
9 строчек кода!
Python
1
2
3
4
5
6
7
8
9
def eratosthenes(N):
    list_of_numbers = []
    for i in range(2, N + 1):
        list_of_numbers.append(i)
    for i in list_of_numbers:
        for elem in list_of_numbers:
            if elem % i == 0 and elem != i:
                print(elem, end=" ")
                list_of_numbers.remove(elem)
2
2 / 2 / 0
Регистрация: 16.02.2020
Сообщений: 3
25.04.2020, 15:53
Совершенно верно! Вы удивительно правы! Я так и написал программу, чтобы она выводила не простые числа (а золотые). А если хотите простые, то переставьте print() в другое место.
0
Заяц, просто Заяц.
 Аватар для Fury67
666 / 280 / 156
Регистрация: 12.11.2017
Сообщений: 882
25.04.2020, 15:58
А как это прогу сделать в одну срочку, чтоб было красиво, а не как у меня....
Python
1
(lambda x:  [[[x.remove(elem), print(elem)]  for elem in x if elem % i == 0 and elem != i] for i in x])  ([i for i in range(2, int(input()) + 1)])
0
2 / 2 / 0
Регистрация: 16.02.2020
Сообщений: 3
25.04.2020, 15:59
Зачем в одну строчку? Сова не налезет на глобус))
0
Заяц, просто Заяц.
 Аватар для Fury67
666 / 280 / 156
Регистрация: 12.11.2017
Сообщений: 882
25.04.2020, 16:02
Как вообще лучше всего делать несколько действий в цикле одной строкой?

Добавлено через 2 минуты
MeAndRey, ну это красивее и круче должно же быть ...
0
0 / 0 / 0
Регистрация: 13.11.2022
Сообщений: 4
19.03.2023, 05:54
мой вариант решения, который не прошел, потому что в проверяющей системе яндекса вообще нет модуля sympy. но он, черт возьми, рабочий!

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from sympy import isprime
 
 
def eratosthenes(n):
    nums = [i for i in range(2, n + 1)]
    deleted_nums = []
    while not (all(map(lambda x: isprime(x), nums))):
        i = nums[0]
        for num in nums:
            if num % i == 0:
                deleted_nums.append(nums.pop(nums.index(num)))
    deleted_nums = list(filter(lambda x: not (isprime(x)), deleted_nums))
    print(' '.join(list(map(lambda x: str(x), deleted_nums))))
0
3 / 3 / 0
Регистрация: 17.04.2024
Сообщений: 5
21.04.2024, 20:54
Все тесты прошёл:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def eratosthenes(n):
    arr = list(range(n + 1))
    p = 1
    while (True):
        f = 0
        j = 2
        while (j <= n):
            if (arr[j] != 0) & (arr[j] > p):
                p = arr[j] 
                i = j + 1
                while (i <= n):
                    if (arr[i] != 0) & (arr[i] % p == 0):
                        print(arr[i], end=' ')
                        arr[i] = 0
                        f = 1        
                    i += 1
            j += 1
        if (f == 0):
            break
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
22.04.2024, 08:30
Ну или так:
Python
1
2
3
4
5
def eratosthenes(n):
    arr = list(range(2, n+1))
    [print(arr.pop(arr.index(elem)), end=' ') for simple in arr for elem in arr if elem >= simple**2 and not elem % simple]
 
eratosthenes(15)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2024, 08:30
Помогаю со студенческими работами здесь

Решето Эратосфена
нужна помощь в написание программы Решето Эратосфена,а именно нужно написать программу, которая определяет количество простых чисел. вот...

Решето Эратосфена
Решето Эратосфена — алгоритм нахождения всех простых чисел до некоторого целого числа n, который приписывают древнегреческому математику...

Решето Эратосфена: вернуть список простых чисел на заданном интервале
Помогите реализовать функцию. Создать функцию, которая принимает два параметра - два числа, и возвращает массив простых чисел в этом...

Решето Эратосфена, кто может ускорить вывод чисел с 2 до 1000000 до 0,5 сек?
a,n = map(int,input().split()) c = d ='' for i in range(0,n+1): c.append(0) for i in range(2,n+1): for j in...

Решето Эратосфена
Определите N = 100000 и создайте массив * (N + 1). Заполните его значениями так, чтобы IsPrime == True, если i — простое число и IsPrime...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru