欧拉筛法筛选素数,不重复标记 python
时间: 2024-02-26 10:26:19 浏览: 60
以下是欧拉筛法筛选素数,不重复标记的Python代码:
```python
def eratosthenes(n):
is_prime = [True] * (n+1)
primes = []
for i in range(2, n+1):
if is_prime[i]:
primes.append(i)
for j in range(len(primes)):
if i * primes[j] > n:
break
is_prime[i * primes[j]] = False
if i % primes[j] == 0:
break
return primes
```
该算法使用is_prime列表来记录每个数是否为素数,初始时所有数都被标记为素数。然后从2开始遍历每个数,如果该数是素数,则将其加入primes列表中,并将其倍数标记为非素数。在将倍数标记为非素数时,可以通过判断当前数和当前素数的乘积是否大于n来提前退出循环,避免不必要的计算。如果当前数能够被某个素数整除,则跳出当前循环,因为该数已经被标记过了。最后返回primes列表即可。
相关问题
欧拉筛法求素数python
以下是使用欧拉筛法求素数的Python代码:
```python
def sieve_of_euler(n):
is_prime = [True] * (n+1)
primes = []
for i in range(2, n+1):
if is_prime[i]:
primes.append(i)
for p in primes:
if p * i > n:
break
is_prime[p * i] = False
if i % p == 0:
break
return primes
```
这个函数的输入参数是一个正整数n,输出是小于等于n的所有素数。该算法的时间复杂度为O(nloglogn),空间复杂度为O(n)。
python欧拉筛法求素数
欧拉筛法是求解素数的一种高效算法,它的基本思想是通过筛去合数来得到素数。下面是Python实现欧拉筛法求素数的示例代码:
```python
def euler_sieve(n):
primes = []
is_prime = [True] * (n + 1)
for i in range(2, n + 1):
if is_prime[i]:
primes.append(i)
for j in range(len(primes)):
if i * primes[j] > n:
break
is_prime[i * primes[j]] = False
if i % primes[j] == 0:
break
return primes
```
在这个函数中,我们首先创建了一个布尔数组`is_prime`,并将其全部初始化为`True`,表示在开始时所有的数都是素数。然后,我们从2开始遍历到`n`,如果当前这个数是素数,我们就把它加入到`primes`数组中,并且把它的倍数全部标记为合数(即将`is_prime[i * primes[j]]`置为`False`)。
最后,我们返回`primes`数组中的所有素数即可。
阅读全文