为除数创建工具

时间:2018-06-28 13:17:20

标签: python greatest-common-divisor

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 :(得分:0)

您当前的逻辑每次遇到不分割该数字的整数时,无论是否有其他数字对其进行除数(即不是质数),您的逻辑每次都会打印“本数” )。

此逻辑可纠正以下问题:

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]

答案 1 :(得分:0)

您的x % number not in listrange在很多时候都是 true ,即使对于素数也是如此。测试素数是错误的事情。

假设您以质数7开头。要测试的第一个数字是2

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

因此其余为11不在listrange()值中(从26(包括端值)。这是因为对于任何给定的质数大于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]

因此您的代码将打印 Prime号码 7次。对于非质数,该检验也适用。 9不是质数,但是9 % 2也是1,因此您的代码将9声明为质数。对于1000(不是素数),您的代码将打印素数 32次!

在测试listrange()中的所有值并确定这些数字中的 none 都可以将数字除而没有余数之前,您不能声明数字是质数。因此,您需要在循环后测试 ;您可以测试emptylist是否为空;这意味着没有除数,即素数的定义:

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

if not emptylist:
    print ("Prime number") 

请注意:您不需要将范围对象转换为数字列表,不仅测试if number in range(...):有用,it's a lot faster than using the same test on a list也可以。