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
语句,只要执行代码,它就会一次又一次地打印素数。
答案 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
因此其余为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]
因此您的代码将打印 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也可以。