Создание инструмента для делителей - PullRequest
0 голосов
/ 28 июня 2018
import requests
def repeat():

  x = int(input("Common divisors of: "))

  listrange = list(range(2,x))

  emptylist = []

  for number in listrange:
    if x % number == 0:
      emptylist.append(number)
      print (emptylist)
    elif x % number not in listrange:
      print ("Prime number")

while True:
  repeat()

Когда я запускаю этот код, он печатает простое число несколько раз, независимо от того, что я набираю.

Вместо этого я хочу дать все общие делители для любого целого числа, кроме 1 и целого числа. Если целое число - простое число, я хочу, чтобы оно напечатало простое число .

Однако, как я упоминал ранее, это по какой-то причине вызывает проблему, приводящую к тому, что всякий раз, когда код выполняется, он печатает простое число снова и снова, даже если используется оператор elif.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Ваш x % number not in listrange будет истинным большую часть времени , даже для простых чисел. Неправильно проверять простые числа.

Скажем, вы начинаете с 7, простого числа. Первое число, которое будет проверено: 2:

>>> x = 7
>>> number = 2
>>> x % number
1

Таким образом, остаток составляет 1. 1 не входит в значения listrange() (которые идут от 2 до 6 включительно). Это связано с тем, что для любого заданного простого числа, большего 2 , деление на 2 приведет к всегда , в результате чего 1 получится как остаток, а 1 равно никогда в ваш список.

2 - не единственное значение, для которого остаток от деления равен 1. Для простого числа 7919 существует 7 таких чисел:

>>> [i for i in range(2, 7919) if 7919 % i < 2]
[2, 37, 74, 107, 214, 3959, 7918]

, поэтому ваш код будет напечатан Простое число 7 раз. И тест будет верным и для не простых чисел; 9 не является простым числом, но 9 % 2 также является 1, поэтому ваш код будет утверждать, что 9 является простым числом. Для 1000, а не простого числа, ваш код будет печатать Простое число 32 раза!

Нельзя утверждать, что число является простым числом, пока вы не проверили все значения в listrange() и не определили, что нет из этих чисел может делить число без остатка. Поэтому вам нужно проверить после цикла; Вы можете проверить, если emptylist пусто; это означает, что не было делителей, само определение простого числа:

for number in listrange:
    if x % number == 0:
        emptylist.append(number)

if not emptylist:
    print ("Prime number") 

В качестве примечания: вам не нужно превращать объект диапазона в список чисел, тестирование не только if number in range(...): работает, это лот быстрее, чем использование того же самого тест по списку .

0 голосов
/ 28 июня 2018

Ваша текущая логика выводит «простое число» каждый раз, когда встречает целое число в диапазоне, который не делит число, независимо от того, делят ли его другие числа (т. Е. Оно не простое) или нет (т. Е. Оно простое) ).

Эта логика исправляет это:

def repeat():

  x = int(input("Common divisors of: "))
  listrange = list(range(2,x))
  emptylist = []

  for number in listrange:
    if x % number == 0:
      emptylist.append(number)

  if not emptylist: #Checks if emptylist is empty i.e. is prime
      print ("Prime number")

  else:
      print (emptylist)

, например

Common divisors of: 5
Prime number

Common divisors of: 28
[2, 4, 7, 14]
...