我是一个初学者,试图创建一个函数来确定一个值是否为素数。
def isPrime(number):
marked = [] ## create empty list
for i in xrange(2, number+1):
if i not in marked: ## begin loop to remove multiples of i in list
for j in xrange(i * i, number + 1, i):
marked.append(j)
if i == number: ## I'm assuming that if
##the program made it here, i is not in marked.
print isPrime(7)
>>> True
print isPrime(10)
>>> None ## This should be False...ok so I tried to tinkering here.
所以我尝试解决这个问题就是将最后一个条件编辑为:
if i == number:
return True
else: ## Begin new line of code to correct for false positive
return False
这条额外的线条会弄乱一切,因为它现在显示:
isPrime(7)
>>> False
编辑结果这个方法完全不好走。因此,根据Jean-Francois的评论,这是一种更容易检查素数的方法
def is_prime(n):
if n<2:
return False # handle special case
sn = int(n**0.5)+1
for i in range(2,sn):
if n%i==0:
return False
return True
让我们说要检查61是否是素数。
所以剩下要测试的是2到7之间的所有内容。如果2到7之间的所有内容都是61并且它们仍然失败,那就意味着我们知道这个数字是素数。
答案 0 :(得分:1)
即使这不是新东西,我也在回答这个问题。它回答了这个问题,给出了两种工作方式,并在python中进行了测试。应该是ontopic。
首先,每次计算筛子都非常不能测试一个数字。 如果你有很多要测试的数字,那就是这样。 一个工作版本(python 2&amp; 3兼容),由我从一些Project Euler解决方案
改编而来=VLOOKUP(D597,'Sheet1'!$AA$3:$AC$5000,3,FALSE)
测试:
def primes(n):
"""Generate a list of the prime numbers [2, 3, ... m] where
m is the largest prime <= n."""
n += 1
sieve = list(range(n))
sieve[:2] = [0, 0]
for i in range(2, int(n**0.5)+1):
if sieve[i]:
for j in range(i**2, n, i):
sieve[j] = 0
# Filter out the composites, which have been replaced by 0's
return [p for p in sieve if p]
要测试特定数字,请改为执行此操作
print(primes(100))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]