Найти - Пользователи
Полная версия: нахождение простых чисел
Начало » Python для новичков » нахождение простых чисел
1
vada
Вобщем мне 12, начал програмировать что то на питоне. Вчера и сегодня пытался сделать алгоритм нахождения простых чисел. Когда начал зацикливать что то идёт не так) Вот код:
 a = 5
a = int(a)
b = 0
b = int(b)
n = []
if a <= 1000:
    while b <= 1000:
        b = b + 1
        if (a % b):
            continue;
        n.append(b)
    if len(n) == 2:
        print(a)

как зациклить код без багов?
Ps: не пешите сообщения в духе: зачем изобретать велосипед?
doza_and
vada
Когда начал зацикливать что то идёт не так
Да вроде все отлично у вас циклится.

 a = 19  # когда вы присвоили целое не нужно a=int(a) оно и так целое уже
if a <= 1000:
    # перебирать до 1000 нет смысла делится на большее оно не сможет
    # range  тут удобнее чем ручное увеличение переменной
    for b in range(2,a): 
        if (a % b)==0:
            print(a, " делится на ",b)
            break # если хоть на чтото делится то уже не простое, дальше нет смысла перебирать
    else:
        print(a, " простое") # Если цикл завершился нормально то число простое
vada
А можете сказать ошибку в моём алгоритме или коде, от вашего сообщения я так и не понял свою ошибку. У вас алгоритм другой) Я хочу реализовать свой код а не ctrl c ctrl v и настраивать) Если ошибка в алгоритме то укажите ошибку и я всмотрюсь в ваш код и сделаю по вашему алгоритму.
xam1816
vada
Если ошибка в алгоритме то укажите ошибку и я всмотрюсь в ваш код и сделаю по вашему алгоритму.
А можешь рассказать что делает каждая строчка твоего кода?.Это кстати важно…
vada
Да извини. просто первый раз на форумах.

 #число которое мы проверяем 
a = 5
#число которым мы пытаемся разделить а
b = 0
#список n в который мы записываем делители (b)
n = [ ]
#я просто заранее ограничил а что бы потом зациклить
if a <= 1000:
#мы делим наше а в диапозоне от 0 до 1000
    while b <= 1000:
#постоянно обновляем b что бы искать новые и новые делители
        b = b + 1
#если а делиться на b то продолжаем если нет то начинаем опять цикл
        if (a % b):
            continue;
#если делиться добавим делитель в список n
        n.append(b)
#если в списке два делителя (ведь простое то которое делиться на 1 и на себя)
    if len(n) == 2:
#то очищаем список (для цикла)
        n.clear()
#и выводим простое число а
        print(a)
xam1816
vada
Если ошибка в алгоритме то укажите ошибку и я всмотрюсь в ваш код и сделаю по вашему алгоритму.
Ты ищешь все делители,еще и сохраняешь их,память тратишь,из-за этого алгоритм становится неэффективным.
vada
ведь простое то которое делиться на 1 и на себя
Если отбросить единицу и двойку,то все что вообще делится без остатка - уже не простое,вот и пиши алгоритм - число дели по порядку на 2,3,4,…N, как в коде который тебе показали
 for b in range(2,a): 
        if (a % b)==0:
            print(a, " делится на ",b)
            break # если хоть на чтото делится то уже не простое, дальше нет смысла перебирать
Ocean
vada
1) Ты задаешь делитель как b = 0
Поэтому в цикле на первом шаге ты получишь ошибку деления на ноль.
Чтобы ее исправить ты придумал: b = b + 1

Сама проверка делится ли число на 0 или на 1, является лишней, потому что:
- деление на 0 вызовет ошибку
- и простое, и составное число делится на 1 и само на себя. Нужно проверять по свойству, которое их отличает. Представь, что есть группа монстров. У всех желтая кожа и 4 лапы, но у части из них 1 глаз, а у части 2 глаза. Тебе нужно разделить их на группы по количеству глаз. Значит, тебе нужно считать именно количество глаз, не тратя силы на проверку цвета кожи или количества лап.

Так и с делителями, можно избавиться от ненужных проверок и начинать перебирать делители с 2.

Тогда всплывет еще одна ошибка: ты добавляешь 1 к делителю до того как проверишь делимое число. Вот тут я взяла из твоего кода эту часть. Попробуй запусти и увидишь, что хотя ты начинаешь проверку с 2, но в цикле проверка начинается с 3.

  
a = 10
b = 2
n = [ ]
if a <= 1000:
    while b <= a:
        b = b + 1 #вот тут ты добавил 1 к b
        print(b)
        if (a % b): # а здесь стал проверять
            continue;
Чтобы не пропускать делитель 2, нужно поменять местами проверку и добавление 1 к b

2. Выше я написала почему стоит начать проверку в 2, а не с 0
Остается вопрос, когда же перестать проверять.
Ты для проверки выбрать число 5 и проверяешь его используя делители от 1 до 1000

Запусти этот код:
  
a = 6
b = 2
n = [ ]
if a <= 1000:
    while b <= 10:
        print('b =', b, 'a/b =', a/b)
        b = b + 1
Получишь:
 b = 2 a/b = 3.0
b = 3 a/b = 2.0
b = 4 a/b = 1.5
b = 5 a/b = 1.2
b = 6 a/b = 1.0
b = 7 a/b = 0.8571428571428571
b = 8 a/b = 0.75
b = 9 a/b = 0.6666666666666666
b = 10 a/b = 0.6

На выводе ты видишь, сам делитель и результат деления.
Когда ты делишь 6 на 7, то целая часть становится равна нулю. Поэтому нет смысла использовать проверку на делители, которые больше самого числа. Ты же проверяешь число 5 с помощью делителей, которые аж до 1000.
В примере про монстров: тебе не надо искать монстров с тремя, четырьмя или пятью глазами. Их нет в толпе.
Число делимое само на себя всегда дает 1. Как мы уже разобрали выше, это позволит узнать простое число перед тобой или нет, значит имеет смысл остановить проверки в случае когда b = a - 1.

Я не знаю что вы уже изучили по математике, поэтому не уверена как объяснить дальше. Напиши, вы уже проходили в школе квадратные корни?

Думаю, что умножение точно уже освоили.
Давай возьмем число 100 и запишем все способы получить его из 2 множителей, и упорядочим их по возрастанию первого множителя:
100 = 2 х 50
100 = 4 х 25
100 = 5 х 20
100 = 10 х 10
Если мы продолжим, то дальше множители просто поменяются местами:
100 = 20 х 5
100 = 25 х 4
100 = 50 х 2
Вот я выписала множители, комбинации которых дадут 100: 2, 4, 5, 10, 20, 25, 50.

Видишь, тут нет чисел больше 50. Значит чтобы проверить 100, нам точно не надо перебирать делители больше 50. Их не существует.
100 = 10 х 10 - умножение числа самого на себя - это квадрат числа. 100 это квадрат 10
То есть для проверки числа 100 на делимость достаточно проверить числа от 2 до 10 включительно, чтобы найти все делители.
Это работает не только с числом 100, но и с любым числом. Чтобы найти все делители нужно проверить делители от 2 до корня квадратного из проверяемого числа.

3) Это не ошибка, а следствие того, что ты поправишь другие моменты.
Так как ты перестанешь делить числа на 1 и на себя, то нужно будет сменить условие if len(n) == 2:
 #если в списке два делителя (ведь простое то которое делиться на 1 и на себя)
    if len(n) == 2:
#то очищаем список (для цикла)
        n.clear()
#и выводим простое число а
        print(a)

Новым правильным условием нахождения простого числа будет: “в результате проверки не было найдено и записано в n ни одного делителя”

doza_and
vada
вашего сообщения я так и не понял свою ошибку. У вас алгоритм другой)
Вы думаете у вас одна ошибка? А написал алгоритм максимально близко к вашим идеям. На самом деле для получения списка простых чисел обычно используется вообще другой алгоритм. Называется решето Эрастофена. Он намного эффективнее вашего.

 #число которое мы проверяем  -- это неплохо функцией сделать
a = 5
#число которым мы пытаемся разделить а -- Оно отлично в for само заведется 
b = 0
#список n в который мы записываем делители (b) -- Его незачем сохранять. выкинул.
n = [ ]
#я просто заранее ограничил а что бы потом зациклить
if a <= 1000:
#мы делим наше а в диапозоне от 0 до 1000 -- незачем так перебирать достаточно до a-1
    while b <= 1000:
#постоянно обновляем b что бы искать новые и новые делители -- Это все делает range выкинул
        b = b + 1
#если а делиться на b то продолжаем если нет то начинаем опять цикл -- незачем искать все делители достаточно одного Изменил условия и цикл.
        if (a % b):
            continue;
#если делиться добавим делитель в список n
        n.append(b)
#если в списке два делителя (ведь простое то которое делиться на 1 и на себя)
    if len(n) == 2:
#то очищаем список (для цикла)
        n.clear()
#и выводим простое число а
        print(a)

vada
Вобщем спасибо всем за помощь) Потом поправлю и код и алгоритм)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB