【问题标题】:Creating a tool for divisors为除数创建工具
【发布时间】:2018-06-28 13:17:19
【问题描述】:
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 和整数之外的任何整数的所有公约数。如果整数是素数,我希望它打印 素数

但是正如我之前提到的,由于某种原因,这会导致一个问题,即无论何时执行代码,它都会一遍又一遍地打印 prime number,即使使用了 elif 语句。 p>

【问题讨论】:

  • 想必import requests这一行可以忽略;请不要包含不属于问题的代码。

标签: python greatest-common-divisor


【解决方案1】:

您当前的逻辑每次遇到不除数范围内的整数时都会打印“素数”,无论是否有任何其他数字除以它(即它不是素数)或不是(即它是素数) )。

这个逻辑纠正了这一点:

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]

【讨论】:

    【解决方案2】:

    您的x % number not in listrange 将是正确的 很多时候,即使是素数。测试素数是错误的。

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

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

    所以余数是11 不在 listrange() 值中(从 26,包括在内)。这是因为对于任何大于 2 的素数,除以 2 将总是导致 1 作为余数,而 1从不 em> 在您的列表中。

    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(...): 工作,it's a lot faster than using the same test on a list

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多