Форум сайта python.su
Вобщем мне 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)
Офлайн
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, " простое") # Если цикл завершился нормально то число простое
Офлайн
А можете сказать ошибку в моём алгоритме или коде, от вашего сообщения я так и не понял свою ошибку. У вас алгоритм другой) Я хочу реализовать свой код а не ctrl c ctrl v и настраивать) Если ошибка в алгоритме то укажите ошибку и я всмотрюсь в ваш код и сделаю по вашему алгоритму.
Офлайн
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)
Офлайн
vadaТы ищешь все делители,еще и сохраняешь их,память тратишь,из-за этого алгоритм становится неэффективным.
Если ошибка в алгоритме то укажите ошибку и я всмотрюсь в ваш код и сделаю по вашему алгоритму.
vadaЕсли отбросить единицу и двойку,то все что вообще делится без остатка - уже не простое,вот и пиши алгоритм - число дели по порядку на 2,3,4,…N, как в коде который тебе показали
ведь простое то которое делиться на 1 и на себя
for b in range(2,a): if (a % b)==0: print(a, " делится на ",b) break # если хоть на чтото делится то уже не простое, дальше нет смысла перебирать
Отредактировано xam1816 (Июль 31, 2021 10:29:26)
Онлайн
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;
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
#если в списке два делителя (ведь простое то которое делиться на 1 и на себя) if len(n) == 2: #то очищаем список (для цикла) n.clear() #и выводим простое число а print(a)
Отредактировано Ocean (Июль 31, 2021 12:02:55)
Офлайн
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)
Офлайн
Вобщем спасибо всем за помощь) Потом поправлю и код и алгоритм)
Офлайн