python函数中检查素数的逻辑有什么缺陷?
我对Python比较陌生,尝试构建一个函数来检查素数,因为我认为这将是一个很好的启动项目,但我的代码将所有内容都作为素数返回,因此显然出了问题。我明白这是一种低效的方法,但我想先了解如何做。以下是我目前的代码:python函数中检查素数的逻辑有什么缺陷?,python,syntax,logic,Python,Syntax,Logic,我对Python比较陌生,尝试构建一个函数来检查素数,因为我认为这将是一个很好的启动项目,但我的代码将所有内容都作为素数返回,因此显然出了问题。我明白这是一种低效的方法,但我想先了解如何做。以下是我目前的代码: def Prime(n): if n == 1 or n == 2 or n == 3: print("This number is prime.") else: i = n - 1 while i > 0:
def Prime(n):
if n == 1 or n == 2 or n == 3:
print("This number is prime.")
else:
i = n - 1
while i > 0:
if n % i == 0:
break
print("This number is not prime.")
else:
i = i - 1
print("This number is prime.")
def Main():
n = int(input("What is the number you'd like to check?"))
Prime(n)
answer2 = input("Thank you for using the prime program.")
Main()
解释逻辑缺陷并不容易,但您可以看到以下代码
def Prime(n):
if n == 1 or n == 2 or n == 3:
print("This number is prime.")
else:
i = n - 1
while i > 0:
if i == 1 or n == 2 or n == 3:
print("This number is prime.")
break
if n % i == 0:
print("This number is not prime.")
break
else:
i = i - 1
def Main():
n = int(input("What is the number you'd like to check? "))
Prime(n)
print("Thank you for using the prime program.")
Main()
以下是您的程序,其中有一些更改:
def Prime(n):
if n == 1 or n == 2 or n == 3:
print("This number is prime.")
else:
i = n - 1
while i > 1:
if n % i == 0:
print("This number is not prime.")
return
i = i - 1
print("This number is prime.")
return
def Main():
n = int(input("What is the number you'd like to check? "))
Prime(n)
print "Thank you for using the prime program."
Main()
首先,现在比较i
,直到i>1
而不是0,因为每个数字都可以被1整除,因此如果使用原始条件,所有数字都将是素数
其次,将break
语句替换为return
。虽然break
可以工作,但在这种情况下,程序将需要更多的修改,因为质数的消息将始终在末尾打印(与非质数消息一起打印)。另外,return
语句在打印之后移动,以实际获得打印。更重要的是,数字是素数的消息在时移到了之外,否则消息将在每次迭代中打印出来
我还删除了else
,而I
在while
循环中正好递减,这对我来说是一个更可读的选择
最后,你的最后一句话,我想,应该是一个输出,现在是。我还在用户提示消息中添加了一个空格,以便数字显示得更清晰。从数学上讲,您只能检查0和sqrt(n)之间的所有整数,以判断数字是否为素数。至于逻辑,您缺少负数处理以及其他内容,请参阅我的以下代码:
def prime(n):
n = abs(n)
if n<4: return True
i = int(sqrt(n))
while i > 1:
if n % i == 0: return False
i -= 1
return True
首先,你的代码永远不会打印“这个数字不是素数”,因为你在它前面放了一个break语句。您可能希望反转这两行,使其成为:
print("This number is not prime.")
break
此外,行i=n-1
应更改为i=n
,以便您也检查起始编号,而不仅仅是小于起始编号的编号。因此,如果您现在尝试代码,您会注意到您正在打印您检查的每个数字是否为素数,而不仅仅是输入值。要使用代码结构解决此问题,请使用标志。例如:
def Prime(n):
flag = true
if n == 1 or n == 2 or n == 3:
print("This number is prime.")
else:
i = n
while i > 0:
if n % i == 0:
print("This number is not prime.")
break
else:
i = i - 1
if flag == true:
print("This number is prime.")
标志检查应该在循环之外。函数内部的打印是重复的,这样的行为是不可取的。python方法是返回一个布尔值,并且显示正确消息的原因。您可能想要实现的另一个更改是将
i=n-1
更改为i=n**0.5+1
def Prime(n):
flag = true
if n == 1 or n == 2 or n == 3:
print("This number is prime.")
else:
i = n
while i > 0:
if n % i == 0:
print("This number is not prime.")
break
else:
i = i - 1
if flag == true:
print("This number is prime.")