返回意外值的素数的Python while循环
我试图找到列表中最大的素数(升序)。我创建了一个while循环,它通过将列表中的一个数字除以每个小于自身的数字来检查该数字是否为素数,并在找到一个因子不小于自身(大于1)的数字时“中断”循环。此循环嵌套在另一个while循环中,该循环向后遍历列表 当我运行代码时,它不断返回数字8(显然不是素数) 我试着在纸上一步一步地阅读代码,插入变量值并进行数学运算。我一定是算错了什么返回意外值的素数的Python while循环,python,Python,我试图找到列表中最大的素数(升序)。我创建了一个while循环,它通过将列表中的一个数字除以每个小于自身的数字来检查该数字是否为素数,并在找到一个因子不小于自身(大于1)的数字时“中断”循环。此循环嵌套在另一个while循环中,该循环向后遍历列表 当我运行代码时,它不断返回数字8(显然不是素数) 我试着在纸上一步一步地阅读代码,插入变量值并进行数学运算。我一定是算错了什么 factors = [2, 3, 4, 6, 8] b = 1 y = len(factors) - 1 x = facto
factors = [2, 3, 4, 6, 8]
b = 1
y = len(factors) - 1
x = factors[y]
z = x - b
while y >= 0:
while b < x:
if x % z == 0:
break
else:
if b == x-1:
print(f'The number {x} is the largest prime in the list')
break #need to end the outer loop here
else:
b +=1
y -= 1
b = 1
print('There were no prime numbers in the list')
你能查一下下面的代码吗
def prime_numbers(numbers):
for i in numbers:
for j in range(2, i):
if i % j == 0:
break
else:
yield i
try:
print(f"{max(prime_numbers([2, 3, 5, 6, 8]))} is the largest prime number.")
except ValueError:
print("There are no prime numbers in the list.")
代码中的几个主要问题:
x
(外循环)和z
(内循环)的值。您将要为z
添加:其他:
b+=1
z=x-b
对于x
:
y-=1
x=系数[y]
b=1
z
,只需从2开始b
,然后向上x
),因此最好对循环使用,而不是while
。这也将更好地安排变量。例如:
factors=[2,3,4,6,8]
对于系数[:-1]中的数字:
对于范围内的b(2,编号):
如果编号%b==0:
打破
elif b==数字-1:
print(f'number{number}是列表中最大的素数')
break#您应该将整个代码放在一个函数中,然后返回此处
print('列表中没有素数')
请注意,除了循环定义的变量外,我们不使用任何其他变量。这使代码更具可读性
因子[:-1]
意味着我们正在以相反的顺序循环列表
python的一个很好的小特性是添加一个。仅当循环耗尽而未满足任何
break
语句时,才会执行此else
。这在我们的例子中是完美的,因为如果内部循环耗尽,那么这个数字肯定是一个素数。因此,它可以是:
factors=[2,3,4,6,8]
对于系数[:-1]中的数字:
对于范围内的b(2,编号):
如果编号%b==0:
打破
其他:
print(f'number{number}是列表中最大的素数')
中断#这将中断外部循环
其他:
print('列表中没有素数')
请注意,在外循环中也使用了相同的技术,就好像内循环耗尽而未命中
else
块中的中断
,这意味着找不到素数,所以我们要打印找不到的消息。既然可以使用print
s或调试器,为什么要在纸上打印呢?因为我在自学,不知道这些选项。是否有建议的资源让我开始?在每次迭代开始时为所有变量添加print(x)
(将x
更改为所需的变量)。不管怎样,您的问题之一是在每次迭代时更新y
和b
,而不是x
,您确定要将z
设置为7吗?这意味着在第一个模中只考虑7的倍数check@MikeSperry如果我们要进行优化,那么在sqrt(x)
之前检查就足够了,而不是x/2
谢谢您的详细解释和建议。我最初尝试使用for循环,但我必须在代码中的某个地方退出,因为它没有按预期工作。我欣赏你所有的示例代码;“我现在要回去自己玩了。”撒拉比尔,非常欢迎你!很高兴能为您提供帮助,我希望这将使您步入正确的改进轨道:)
def prime_numbers(numbers):
for i in numbers:
for j in range(2, i):
if i % j == 0:
break
else:
yield i
try:
print(f"{max(prime_numbers([2, 3, 5, 6, 8]))} is the largest prime number.")
except ValueError:
print("There are no prime numbers in the list.")