在Python中,编写一个脚本,确定用户输入的数字是否为素数
编写一个脚本,确定用户输入的数字是否为素数,并根据脚本找到的内容打印“您输入的数字是素数”或“您输入的数字不是素数”在Python中,编写一个脚本,确定用户输入的数字是否为素数,python,Python,编写一个脚本,确定用户输入的数字是否为素数,并根据脚本找到的内容打印“您输入的数字是素数”或“您输入的数字不是素数” 我有一些测试用例失败的代码,我不知道为什么。我在这里看到了一些涉及计算sqrt的答案,但我不明白为什么这会有好处 num= int(input()) if num == 0 or num ==1: print('The number you inputted is not a prime number.') while num < 0: break if
我有一些测试用例失败的代码,我不知道为什么。我在这里看到了一些涉及计算sqrt的答案,但我不明白为什么这会有好处
num= int(input())
if num == 0 or num ==1:
print('The number you inputted is not a prime number.')
while num < 0:
break
if num > 0:
for i in range(2,num):
if num%i==0:
print('The number you inputted is not a prime number.')
break
else:
print('The number you inputted is a prime number.')
break
num=int(输入())
如果num==0或num==1:
打印('您输入的数字不是质数')
当num<0时:
打破
如果num>0:
对于范围内的i(2,num):
如果num%i==0:
打印('您输入的数字不是质数')
打破
其他:
打印('您输入的数字是素数')
打破
当我尝试使用一些测试用例时,代码总是正确的,但它没有通过我的家庭作业。你的逻辑是错误的;只有当条件的计算结果为
True
,您才应该中断,因为您需要测试所有小于等于num**0.5
(num
)的数字。9是代码计算为素数的非素数的示例
你想要这样的东西:
prime = True
if num > 0:
for i in range(2,num):
if num % i == 0:
prime = False
break
if prime:
print(f'{num} is a prime number.')
else:
print(f'{num} is not a prime number.')
通过在开始时将
prime
设置为True
,并仅在找到因子时将其更改为False
,我们可以在对i
的所有值的条件进行评估后,判断该数字是否为prime。以下逻辑中出现问题:
for i in range(2,num):
if num%i==0:
print('The number you inputted is not a prime number.')
break
else:
print('The number you inputted is a prime number.')
break
要查看问题发生的位置,请尝试使用代码检查9
是否为prime。
您的for
循环执行以下操作:
i=2
如果num%i==0,而不是prime,则中断
else
,素数,中断for
循环保证在i==2时停止。
换句话说,根据这个算法,素数的定义是“任意奇数”
要解决这个问题,您需要找到一种方法,允许循环在所有剩余的可能除数之间迭代,而不会在第一次迭代后中断
我就到此为止,给你一个机会看看你是否能自己解决剩下的问题。如果您不能取得任何进展,请告诉我,我会给出另一个提示。“我在这里看到一些涉及计算sqrt的答案,但我不明白为什么这会有好处”-平方根的原因是效率。以数字16为例,它包含因子(1,16)、(2,8)、(4,4)、(8,2)、(16,1)。因为16的平方根是4,所以测试超出范围的任何数字都是多余的。此外,你不需要测试任何不是素数的数字。由于4是2和2的系数,因此测试2、4和8也是多余的。对于这个问题,这可能没什么帮助,但你至少可以忽略2之外的偶数。只检查奇数,直到候选数的平方根,这是一个好的开始。你可以考虑的最后一个优化是奇数素数>3始终是整数k的形式(6K±1),因为6K、6K±2和6K±4是偶数,6K±3可被3和6k+5整除。≡ 6k-1.注:如果没有小的主要因素,则试验划分是缓慢的。Baillie PSW是目前最好的方法(保证小数字的结果,即使大数字也没有已知的反例)。啊!忍者:P