Python—打印前1000个素数不需要';停不下来
在我的最新代码中有一个问题,我根本不知道如何解决。基本上,我打印出的是前1000个素数,但我的代码打印出的素数远远超过了前1000个素数的限制。我已在代码中指定在1000处停止。这是我的密码:Python—打印前1000个素数不需要';停不下来,python,for-loop,primes,Python,For Loop,Primes,在我的最新代码中有一个问题,我根本不知道如何解决。基本上,我打印出的是前1000个素数,但我的代码打印出的素数远远超过了前1000个素数的限制。我已在代码中指定在1000处停止。这是我的密码: import itertools counter = 1 while (counter <= 1000): for i in itertools.count(start=3, step=1): for a in range(2, i/2): if
import itertools
counter = 1
while (counter <= 1000):
for i in itertools.count(start=3, step=1):
for a in range(2, i/2):
if (i % a == 0):
break
else:
print i
counter += 1
Count
从不停止生成数字,因此本质上你被困在for
循环中
快速解决方法是:
import itertools
counter = 1
for i in itertools.count(start=3, step=1):
for a in range(2, i/2):
if (i % a == 0):
break
else:
print i
counter += 1
if counter > 1000:
break
Count
从不停止生成数字,因此本质上你被困在for
循环中
快速解决方法是:
import itertools
counter = 1
for i in itertools.count(start=3, step=1):
for a in range(2, i/2):
if (i % a == 0):
break
else:
print i
counter += 1
if counter > 1000:
break
您的版本被卡在内部循环中
import itertools
counter = 1
for i in itertools.count(start=3, step=1):
if(counter<1000):
for a in range(2, i/2):
if (i % a == 0):
break
else:
print i
counter += 1
else:
break
导入itertools
计数器=1
对于itertools.count中的i(开始=3,步骤=1):
如果(计数器您的版本卡在内部循环中
import itertools
counter = 1
for i in itertools.count(start=3, step=1):
if(counter<1000):
for a in range(2, i/2):
if (i % a == 0):
break
else:
print i
counter += 1
else:
break
导入itertools
计数器=1
对于itertools.count中的i(开始=3,步骤=1):
如果(counter你有很多关于为什么你的答案不起作用的回答。我会这样做!我宁愿构建一个素数生成器并从中提取
class PrimeNumberGen(object):
def __init__(self,max_prime=None):
if max_prime:
self.numbers = range(2, max_prime+1)
else:
self.numbers = itertools.count(start=2, step=1)
def __next__(self):
for num in self.numbers:
for divisor in range(2, int(num**0.5)+1):
if num % divisor == 0:
break
else:
return num
primes = PrimeNumberGen()
for _ in range(1000):
print(next(prime))
关于为什么你的答案不起作用,你已经得到了很多回答。我想这样做!我宁愿构建一个素数生成器,然后从中提取
class PrimeNumberGen(object):
def __init__(self,max_prime=None):
if max_prime:
self.numbers = range(2, max_prime+1)
else:
self.numbers = itertools.count(start=2, step=1)
def __next__(self):
for num in self.numbers:
for divisor in range(2, int(num**0.5)+1):
if num % divisor == 0:
break
else:
return num
primes = PrimeNumberGen()
for _ in range(1000):
print(next(prime))
您需要在所有循环之外初始化计数器一次,按照写入方式,您将在循环内部重置计数器,而每次:
counter = 0
nums = itertools.count(start=3, step=1)
while counter <= 1000:
i = next(nums)
for a in range(2, i/2):
if i % a == 0:
break
else:
print(i)
counter += 1
计数器=0
nums=itertools.count(开始=3,步骤=1)
当计数器在所有循环之外时,您需要初始化计数器一次,按照您写入计数器的方式,您每次都在计数器内部重置计数器:
counter = 0
nums = itertools.count(start=3, step=1)
while counter <= 1000:
i = next(nums)
for a in range(2, i/2):
if i % a == 0:
break
else:
print(i)
counter += 1
计数器=0
nums=itertools.count(开始=3,步骤=1)
计数器即使使用您的解决方案,您的代码也会打印999个素数,而不是1000个。(最后一个数字应该是7919,而不是7907)
代码中唯一的问题是
counter=0#而不是counter=1
即使使用您的解决方案,您的代码也会打印999个素数而不是1000个。(最后一个数字应该是7919而不是7907)
代码中唯一的问题是
counter=0#而不是counter=1
您的break语句只对范围内(2,i/2)
循环中断,而不是它上面的循环。因此,对于i in itertools.count(start=3,step=1)
循环继续进行。@BradBeattie这是设计的,这是正确的。问题是他们需要第二次中断
,以摆脱更大的循环。对于范围内的(2,math.sqrt(i)+1)
将更有效率,因为如果i
有一个素因子,则有一个因子小于或等于sqrt(i)
。谢谢unutbu-你的break语句只会对范围内(2,i/2)的循环进行中断,而不是对其上方的循环进行中断。因此,对于i in itertools.count(start=3,step=1)的
循环继续进行。@BradBeattie这是设计的,这是正确的。问题是他们需要第二次中断
,以摆脱更大的循环。对于范围内的(2,math.sqrt(i)+1)
将更有效率,因为如果i
有一个素因子,则有一个因子小于或等于sqrt(i)
。谢谢unutbu-我会的