筛法求素数真的很快
素数判断如何判断一个数是否为素数
素数判断如何判断一个数是否为素数素数是指除了1和本身之外没有其他因数的自然数。在数论中,素
数因其独特的性质和重要性而备受关注。判断一个数是否为素数是数
学中的一个基本问题,下面将介绍几种常用的方法来判断一个数是否
为素数。
一、试除法
试除法是一种简单直接的判断素数的方法。对于一个待判断的数n,如果n能被不大于根号n的自然数整除,则n不是素数;如果n不能被不大于根号n的自然数整除,则n是素数。
二、埃拉托斯特尼筛法
埃拉托斯特尼筛法是一种高效的筛选素数的方法。基本思想是从2
开始,依次找到每一个素数,然后将能被该素数整除的数标记为非素数。具体操作为,将2到N的自然数按顺序排列,对于每个素数p,
将大于p且能被p整除的数标记为非素数。遍历完所有素数后,剩下
的未被标记的数即为素数。
三、费马小定理
费马小定理是一种通过取模运算判断素数的方法。若p为素数,a
是小于p的任意整数,则a的p次幂与a模p的余数相等。即a^p ≡ a (mod p)。基于这个定理,可以用快速幂算法来计算a^p的结果,如果
与a模p的余数相等,则a为素数。
四、Miller-Rabin素性测试
Miller-Rabin素性测试是一种概率算法,用于测试一个数是否为素数。该算法基于费马小定理的倒推,通过多次的概率测试来判断一个数的素性。算法的具体原理较为复杂,在此不做详细介绍。
综上所述,判断一个数是否为素数可以使用试除法、埃拉托斯特尼筛法、费马小定理或Miller-Rabin素性测试等方法。根据具体需求和时间复杂度要求选择合适的算法来判断素数。
atcoder 欧拉筛法
atcoder 欧拉筛法
欧拉筛法是一种用于求解素数的高效算法。它的原理是通过逐步筛除合数,最终得到所有的素数。欧拉筛法的时间复杂度为O(nloglogn),是一种非常优秀的算法。
我们来看一下欧拉筛法的基本思想。我们知道,素数是只能被1和自身整除的正整数。而合数则是除了1和自身之外还有其他因数的数。所以,欧拉筛法的思想就是从小到大枚举每个数,如果它是素数,那么它的倍数都是合数,我们将其标记为非素数。
具体的实现步骤如下:
1. 首先,我们需要一个数组prime[]来记录每个数是否为素数。初始化时,将所有的数都标记为素数。
2. 然后,我们从2开始枚举每个数i,如果它是素数,那么将其倍数都标记为非素数。
3. 最后,我们遍历数组prime[],将所有标记为素数的数输出即可。
下面是欧拉筛法的具体实现代码:
```cpp
const int MAXN = 1000000; // 最大范围
bool prime[MAXN]; // 记录每个数是否为素数
void eulerSieve() {
memset(prime, true, sizeof(prime)); // 初始化为素数 prime[0] = prime[1] = false; // 0和1不是素数
for (int i = 2; i < MAXN; i++) {
if (prime[i]) {
for (int j = i * 2; j < MAXN; j += i) {
prime[j] = false; // 将倍数标记为非素数
}
}
}
}
int main() {
大素数筛法 -回复
大素数筛法-回复
大素数筛法(也称为厄拉多塞筛法)是一种用于筛选素数的高效算法。它使用了一种简单而有趣的方法,通过筛除非素数的倍数来逐渐找出所有的素数。在这篇文章中,我们将一步一步地讲解大素数筛法的原理和实现过程。
首先,让我们来回顾一下什么是素数。素数是指只能被1和它本身整除的数,例如2、3、5、7等。素数在数论和密码学等领域具有重要的应用,因此求素数一直是数学家和计算机科学家们感兴趣的问题。
大素数筛法的基本思想是从2开始,将所有倍数都标记为非素数,然后继续找到下一个未被标记的数,重复这个过程,直到筛选完成。下面我们将一步一步地演示这个算法:
1. 首先,我们需要确定一个上限N,以确定需要筛选的素数范围。我们将从2到N的所有数都视为候选数。
2. 创建一个布尔数组isPrime,其长度为N+1。开始时,将数组中的所有元素都设置为true,表示它们都是素数的候选者。
3. 从2开始,将所有2的倍数(除了2本身)标记为非素数。然后,再找到下一个未被标记的数,即3,将所有3的倍数(除了3本身)标记为非素数。
4. 接下来,找到下一个未被标记的数,即5,将所有5的倍数(除了5本身)标记为非素数。我们继续这个过程,直到筛选到√N为止。
5. 最后,遍历isPrime数组,将所有仍然标记为true的数添加到一个结果数组中,这些数就是素数。
现在,我们来使用一个具体的例子来说明大素数筛法的执行过程。
假设我们想要找出小于或等于30的所有素数。
首先,我们将确定上限N为30,并创建一个长度为31的布尔数组isPrime。
筛法求素数
筛法求素数
一,确定素数。二,以此数为圆心,作对称轴。三,逐步减去该圆周长的一半,直至结果为素数。四,看哪个素数与对称轴之积最大,则是这个素数。如上面所示: 16与15的差=1,这样,很快就能看出这个素数是1。五,如果不符合条件,那么必须重新开始。找到符合条件的数后,再用筛法。…我的老师——赵老师
为了表示大自然对我们的恩泽,便出了一道题给我们做。我听到了这个消息时,高兴得两只手抓住了头发,感觉头发都快掉光了。“太棒了!我终于可以摆脱他们啦!”
找出来,每天除了吃饭、睡觉,其余的时间我都花在寻找素数和合数上面了。我把找素数和合数当成游戏一般,玩耍一番。我去问爸爸妈妈,我从她们那里得知方程就是求未知数的值的,我很惊奇,便去查资料。方程是一种解决数学问题的等式,是比较重要的数学模型之一。它既是一种等式,又是一个未知数。同时也是具有等号左边的值和右边的未知数的等式。有时候,我感觉很难理解它的含义。我去翻阅书本,书上写着:“方程就是用一个未知数和一个已知数表示出两个数之间的关系。例如: X+Y=Y,则X和Y就叫做方程的未知数,X和Y就叫做方程的两个数,而方程里的未知数,等于方程两边的数的总和。”书上讲的是那么的清晰,我渐渐地明白了方程的意思。
“接下来就是探索素数和合数的奥秘了。”老师说道。随着老师这一声令下,同学们又在火热的研究素数和合数的道路上狂奔。我问同学们,他们问了一些同学,我一点也没想到一道简单的题,可以出
现这么多问题。由于没有经验,我研究了很久,还是没能解决。老师走过来,亲切地对我说:“你怎么了?这道题目是这样做的,为什么不会呢?”“对啊,你能告诉我吗?”我回答道。老师不紧不慢地说:“好吧,这样做吧!”说完,老师便教我做这道题。老师解释道:“这样的做法:素数÷1÷2÷3÷4÷5,同理,合数也是这样算的。”我恍然大悟,原来做题可以这么简单。在我们班上,还有一位特殊的数学家——罗嘉东,同学们都尊敬地称呼他为“罗爷”。他不仅数学好,还喜欢乐器,更令人钦佩的是他的乒乓球技术,称他为“乒乓球王子”都不为过。
c语言求素数最快方法
c语言求素数最快方法
摘要:
1.引言
2.最快方法:埃拉托斯特尼筛法(Sieve of Eratosthenes)
3.算法原理
4.C语言实现
5.代码解析
6.性能测试与优化
7.结论
正文:
**引言**
在计算机科学和编程领域,寻找素数是一种常见的任务。素数是指大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。求解素数问题有助于理解数论、密码学等领域。本文将介绍求解素数的最快方法——埃拉托斯特尼筛法(Sieve of Eratosthenes)及其C语言实现。
**最快方法:埃拉托斯特尼筛法(Sieve of Eratosthenes)**
埃拉托斯特尼筛法是一种基于二维数组的算法,用于找出小于等于上限的素数。该算法利用了素数的性质:如果一个数是素数,那么它的平方模小于等于上限的数也是素数。通过不断标记数组中的素数,最终得到小于等于上限的素数。
**算法原理**
1.创建一个二维数组,用于存储小于等于上限的数。
2.初始化数组中的所有元素为1,表示都是素数。
3.从2开始,遍历数组,将数组中的所有素数两两相乘,得到的结果大于上限的,将其对应的元素标记为0,表示该数不是素数。
4.重复步骤3,直到数组中的所有元素都被标记或遍历到上限。
**C语言实现**
以下是一个简单的C语言实现:
```c
#include <stdio.h>
#include <stdbool.h>
void sieve_of_eratosthenes(int limit) {
bool *prime = (bool *)malloc((limit + 1) * sizeof(bool));
素数常见的算法
求素数的三种方法
素数的定义:
素数也叫质数。一个大于1的自然数,除了1和它本身之外,不能被其它自然数整除的数叫做素数;能被其它自然数整除的数叫做合数。规定,1既不是质数也不是合数。
法一:试除法(判断素数)
让N被2如果N能被其中任何一个整数整除,则提前结束循环,N不是素数;如果N不能被其中任何一个整数整除,则N是素数。
代码实现:
法二:埃氏筛法(求一个范围中所有素数)
试除法可以用来判断一个数是否为素数,如果用来求某一范围内所有素数的话,效率就比较低。埃氏筛法是用来解决这类问题的古老而简单高效的方法,可以快速找到[2,]n中的所有素数。具体操作是这样的:从2开始寻找素数,每次找到一个素数后就将它的倍数全部筛掉,并将该素数存储到另一个数组中,不断循环,直到原数组为空。
法三:欧拉筛法(埃氏筛法的优化版)
埃氏筛法中,由于一个数可以既是一个素数的倍数,又是另一个素数的倍数,可以发现这会出现重复标记的情况,即同一个数被筛掉了不止一次,浪费操作了。
欧拉筛法就是在埃氏筛法的基础上多了判断的步骤,从而消失了这种重复标记的情况,核心思想是用合数中的一个因数筛掉这个合数。
具体操作为:利用已经求得的素数,第一重循环将区间内的数从小到大遍历,第二重循环将以求得的素数从小到大遍历,将这个数和素数的乘积标记为合数。如果一个数能被素数整除,跳出循环。
素数判断最快方法
素数判断最快方法
素数是大于1的自然数中,只有1和它本身两个因数的数。在数学中,素数是一个重要的概念,它们在很多领域中都有广泛的应用。判断一个数是否为素数是素数计算中的一个常见问题。下面介绍几种最快的判断素数的方法。
方法一:试除法
试除法是判断一个数是否为素数的常用方法之一。具体步骤如下:
1. 将待判断的数除以1到它的最大因数n(n小于等于6),并记录下每次除到的数。
2. 如果每次除到的数都是n,那么该数就是素数;否则,该数不是素数。
这种方法的优点是简单易行,但是效率较低,需要反复进行除法运算。
方法二:筛法
筛法是判断一个数是否为素数的另一种常用方法。具体步骤如下:
1. 将待判断的数从1到它的最大因数n(n小于等于6)依次除以每个小于等于它的因数,并记录下每次除到的数。
2. 如果每次除到的数都是n,那么该数就是素数;否则,该数不是素数。
这种方法的优点是速度快,只需要进行因数分解即可,但是需要记住每个小于等于它的因数的情况。
方法三:埃氏筛法
埃氏筛法是判断一个数是否为素数的第三种常用方法。具体步骤如下:
1. 将待判断的数从1到n(n小于等于6)依次排列,并将它们划分为素数和合数两部分。
2. 选取一个小于等于n的随机数i,然后将待判断的数i从素数部分中取出,
并继续从1到i的平方根范围内选取一个数j,然后将待判断的数j从合数部分中取出。
3. 如果i等于j的平方根,那么该数就是素数;否则,该数不是素数。
埃氏筛法是一种高效的算法,可以进行因数分解,并且适用于较大的数的判断。但是需要记住每个数的情况,并且选取随机数的时间复杂度较高。
素数快速筛法及公式
素数快速筛法及公式
素数快速筛法及公式
梅生林
安徽合肥
2012.07.12
摘要:在素数的研究中,总结出素数快速筛法及公式,在这个基础上扩展了素数的一些关系、性质。
关键词:素数快速筛法,素数通式,质数筛法公式
1.引言
素数(Prime Number)是指自然数中那些只能被1和本身整除的数,依次为2、3、5、7、11、13、17、19、23、29…。前人已证明:素数有无限多个。一直到现在人们判定、寻找素数的方法,还是古希腊的数学家艾拉托斯芬(Eratosthenes)提出过的筛式方法,简称“艾氏筛法”。即在任意有限自然数N以内判定素数时,先把N一个不漏的写下来,然后划掉根号N()内所有素数的倍数,我们就能得到N以内的全部素数。艾氏筛法判定素数的过程机械,也未能表示素数公式和一些性质。
关于寻找判定表示素数的方法公式,以前众多数学家进行了艰辛探索,也提出了很多关于素数的猜想和问题。欧拉(Euler)就提出二项式公式n2-n+41能生成一部分素数的数型公式,直到现在,素数研究中仍然还有许多未解问题。本文通过素数快速筛法及公式,总结出一些素数的新理论,使素数筛法及公式等都将是一次质变,将为素数研究抛砖引玉,也可能为数论增添上新的一页。
2.素数的快速筛法原理及公式
当我们用艾氏筛法是要划掉每个合数,只2的倍数就差不多要划掉一半自然数,越往后面合数越多,而留下的素数越少。我们能不能利用数学原理、公式去掉大部分合数呢?答案是肯定的。
2.1 当我们想去掉第一个素数2的倍数时,我们可能会想到用:
2N+1 (N≥1)N为大于等于1的自然数,以下公式同上。2.2 去
素数的算法原理和应用
素数的算法原理和应用
概述
素数是指只能被1和自身整除的正整数。素数在密码学、计算机科学和数学研
究等领域具有重要的应用。本文将介绍素数的算法原理以及在实际应用中的一些常见场景。
素数的判断算法
判断一个数是否为素数是素数算法的基础。常用的素数判定算法有两种:试除
法和素数筛法。
试除法
试除法是最简单直观的素数判定方法。对于一个待判断的正整数n,只需从2
开始遍历到sqrt(n)(即n的平方根)的整数m,检查是否有任何m能整除n。若
能找到能整除n的m,则n不是素数;否则,n是素数。
试除法的时间复杂度为O(sqrt(n)),适用于判断大部分整数是否是素数。然而,对于非常大的数,这种方法的效率较低。
素数筛法
素数筛法通过筛选法来判断素数。其中最常用的是埃拉托斯特尼筛法。首先,
生成一个长度为n+1的布尔类型数组,将其初始值都设为true。然后从2开始遍
历到sqrt(n)的整数m,在数组中将2的倍数、3的倍数、4的倍数…全部标记为false。最后,数组中值为true的索引对应的数就是素数。
素数筛法的时间复杂度为O(nloglogn),虽然比试除法高效,但由于需要生成
一个长度为n+1的数组,对于非常庞大的数,也存在一定的限制。
素数的应用
素数在密码学、计算机科学和数学研究等领域有广泛的应用。以下是一些常见
的素数应用场景。
密码学中的应用
素数在密码学中起到至关重要的作用,特别是在公钥密码学中。其中一个常见
的应用是RSA加密算法。在RSA算法中,首先需要生成两个大素数p和q,然后
计算它们的乘积n=p*q。n被用作加密和解密过程中的模数,而p和q用于生成公钥和私钥。
大素数筛法 -回复
大素数筛法-回复
大素数筛法是一种用于寻找大范围内素数的数学算法。素数是只能被1和自身整除的自然数,而大素数则是指比较大的素数。素数在数学领域以及密码学等领域具有重要的应用价值。在本篇文章中,我将详细介绍大素数筛法的原理和步骤。
首先,我将解释什么是素数筛法。素数筛法是一种通过排除法找出一定范围内所有素数的方法。大素数筛法与传统素数筛法的区别在于它可以处理更大范围内的数字。因为大素数的位数非常庞大,传统的素数筛法在处理大数字时会非常耗时,因此需要使用更高效的算法。
大素数筛法的核心思想是从小到大枚举所有数字,并将能够整除的数字排除,最终剩下的即为素数。但是在大数范围内,一次枚举并排除数字将是非常耗时的操作。因此,大素数筛法采用了一些优化技巧来提高效率。
首先,我们需要明确筛法的目标是什么。我们要找到所有小于等于N的素数,其中N是一个大整数。接下来,我们定义一个数组isPrime[N+1],其中isPrime[i]表示数字i是否为素数。初始时,我们认为所有数字均为素数,因此isPrime[i]的初始值为true(或者可以设为1)。
第一步,我们将isPrime[0]和isPrime[1]的值设为false,因为0和1不是素数。
第二步,我们从2开始,遍历2到N的所有数字。对于每个数字i,如果isPrime[i]为true,则将i的所有倍数j,j=2*i, 3*i, ..., N,都标记为false。这是因为这些数字不可能是素数,因为它们能被i整除。
第三步,我们遍历完所有数字后,isPrime数组中为true的即为素数。
欧拉筛选素数法
欧拉筛选素数法
欧拉筛选素数法是一种高效的素数筛选算法,它是由古希腊数学家欧拉发现的。它的优点在于它可以比较快速地筛选出一定范围内的素数,而且它的实现也比较简单。本文将介绍欧拉筛选素数法的原理及其具体实现过程。
一、欧拉筛选素数法的原理
欧拉筛选素数法的原理是:从2开始,把2的倍数剔除掉,然后再把3的倍数剔除掉,再把下一个没有被剔除的数作为第一个素数,再把它的倍数剔除掉,以此类推,直到剔除掉所有小于指定数的素数。
因此,如果要筛选出小于等于n的所有素数,那么首先需要构造一个大小为n的表,初始时均设置为“真”(即假设所有数都是素数),然后从2开始,把2的倍数剔除掉,然后再把3的倍数剔除掉,再把下一个没有被剔除的数作为第一个素数,再把它的倍数剔除掉,以此类推,直到剔除掉所有小于n的素数。最后,表中剩下的值为真的数就是素数。
二、欧拉筛选素数法的具体实现
1.首先,根据欧拉筛选素数法的原理,需要构造出一个大小为n的表,初始时均设置为“真”(即假设所有数都是素数)。
2.然后,从2开始,把2的倍数剔除掉,然后再把3的倍数剔除掉,再把下一个没有被剔除的数作为第一个素数,再把它的倍数剔除掉,以此类推,直到剔除掉所有小于n的素数。
3.最后,表中剩下的值为真的数就是素数。这些素数就是欧拉筛选素数法筛选出来的素数。
三、欧拉筛选素数法的优点
欧拉筛选素数法具有如下优点:
1.算法简单,实现起来比较容易;
2.比较快速地筛选出一定范围内的素数;
3.能够节省空间,计算的复杂性也较低。
因此,欧拉筛选素数法是一种比较有效的素数筛选算法,它不仅实现方便,而且效率也比较高。
埃氏筛选法求素数
埃氏筛选法求素数
埃氏筛选法,也称埃拉托斯特尼筛法,是一种用于筛选素数的简单而有效的算法。它的基本思想是从2开始,将每个素数的倍数全部标记为合数,直到筛选完所有小于等于给定数的素数为止。
埃氏筛选法的具体步骤如下:
1. 创建一个长度为n+1的布尔数组,初始值都设为True。这
个数组用于标记每个数是否为素数。
2. 从2开始,将2的倍数全部标记为False,因为2是素数。
3. 找到下一个未被标记为False的数,即3,将3的倍数全部
标记为False。
4. 重复步骤3,直到找到的数的平方大于n为止。
使用埃氏筛选法可以高效地找到小于等于给定数n的所有素数。这种算法的时间复杂度为O(nloglogn),是一种非常高效的素
数筛选方法。
下面是一个使用埃氏筛选法求解素数的示例代码:
```python
def sieve_of_eratosthenes(n):
is_prime = [True] * (n + 1)
is_prime[0] = is_prime[1] = False
p = 2
while p * p <= n:
if is_prime[p]:
for i in range(p * p, n + 1, p):
is_prime[i] = False
p += 1
primes = []
for i in range(2, n + 1):
if is_prime[i]:
primes.append(i)
return primes
n = int(input("请输入一个正整数n:")) primes = sieve_of_eratosthenes(n)
埃氏筛法求素数
埃氏筛法求素数
素数一直以来都是数学家们所钟情的主题,古希腊数学家埃及里斯(Eratosthenes)在公元前三世纪就发明了一种基于排除法的算法埃氏筛法,它可以用来有效地求出指定数字范围内的素数。其基本原理是,从2开始,把2的倍数剔除掉,然后再把3的倍数剔除掉,最后再把4的倍数剔除掉,以此类推,如此循环地排除,剩下来的数字就是指定范围内的素数。
埃氏筛法的实现,一般采用一维布尔数组的形式,其元素的个数为指定数字范围内的数字数目,元素值初始均为真,每次排除一个指定数字的倍数时,即将该数字的倍数设为假,这样可以较简单地实现埃氏筛法,并且排除一个数字的倍数可以利用已排除的数字的倍数的倍数进行排除,即可以多次排除,从而大大地提高求素数的效率。
实际应用中,在求特定数字范围内的素数时,可以利用埃氏筛法进行求解,但是,当数字范围较大时,这种方式会有一定的效率问题,因为必须要对所有数字进行判断。
从历史上看,埃及里斯提出了埃氏筛法以求素数,这种排除法算法虽然比较直接,但还是具有很大的时间效率,所以,后来中国古代数学家张丘建更进一步,提出了更加高效的“秦九韶算法”,而此算法是后来的素数求解算法(如Sieve of Atkin算法和Sieve of Sundaram算法)的基础。
在具体实现上,埃氏筛法的实现可以适用各种编程语言,如C、C++、Java等。下面给出一段C语言代码,用来实现埃氏筛法:
#include <stdio.h>
//求1000以内的素数
#define N 1000
int main( )
欧拉筛法求素数python
欧拉筛法求素数python
欧拉筛法求素数python
欧拉筛法是一种高效的求素数的方法,它可以在O(n)的时间复杂度内
求出小于等于n的所有素数。本文将详细介绍欧拉筛法的原理和实现,并提供Python代码实现。
1. 欧拉筛法原理
欧拉筛法基于以下两个定理:
1) 如果p是质数,则p的倍数中只有p本身和1是质数。
2) 如果n不是质数,则n可以分解成若干个质因子之积,其中至少有一个质因子小于等于根号n。
根据以上定理,欧拉筛法的思路如下:
1) 初始化一个数组is_prime,其中is_prime[i]表示i是否为质数。
2) 从小到大枚举每个数i,如果is_prime[i]为true,则将i加入素数列
表,并将i的倍数标记为false。
3) 如果is_prime[i]为false,则跳过i。
4) 当枚举到sqrt(n)时,停止枚举。此时数组is_prime中所有值为true的下标即为小于等于n的所有素数。
2. 欧拉筛法实现
下面是Python代码实现:
def euler_sieve(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
最快的筛法求素数的方法
最快的筛法求素数的方法
素数是指只能被1和自身整除的正整数。求解素数一直是数学领域的一个重要问题,也是计算机科学中常见的算法挑战之一。本文将介绍一种被称为“埃拉托斯特尼筛法”的算法,它是一种高效的方法来找出一定范围内的素数。
埃拉托斯特尼筛法的基本思想是从2开始,将所有的倍数标记为合数,直到遍历完所有小于等于给定范围的数。具体步骤如下:
1. 创建一个长度为n+1的布尔数组,用来表示从2到n的所有数。初始时,将数组中的所有元素都设置为true,表示它们都是素数的候选者。
2. 从2开始遍历数组,如果当前数字是素数(即数组中对应位置的值为true),则将其所有的倍数标记为合数(将对应位置的值设置为false)。
3. 继续遍历数组,重复步骤2,直到遍历完所有小于等于给定范围的数。
4. 遍历完数组后,所有值为true的位置对应的数字即为素数。
下面是一个示例,以求解小于等于30的素数为例:
创建一个长度为31的布尔数组,初始时所有元素都为true。
从2开始遍历数组,发现2是素数,将其所有的倍数(4、6、8、...)标记为合数。
继续遍历,发现3是素数,将其所有的倍数(6、9、12、...)标记为合数。
继续遍历,发现4不是素数(因为它已经被标记为合数),跳过。
继续遍历,发现5是素数,将其所有的倍数(10、15、20、...)标记为合数。
继续遍历,发现6不是素数,跳过。
继续遍历,发现7是素数,将其所有的倍数(14、21、28、...)标记为合数。
继续遍历,发现8不是素数,跳过。
继续遍历,发现9不是素数,跳过。
集合实现筛选法求素数
集合实现筛选法求素数
素数在数学领域中有着重要的地位,不仅在数学本身中拥有广泛的应用,而且在计算机科学中也具有重要的意义。我们知道,素数指的是只能被1和它本身整除的数,那么如何求解素数?
一般来说,我们可以使用试除法或者埃拉托色尼筛法等方法来求解素数。而今天我们要介绍的是集合实现筛选法求素数。
1. 筛选法的基本原理
筛选法求素数的基本原理是通过枚举法把小于等于N的合数筛去,最后剩下的就是质数。具体而言,我们可以定义一个长度为N的数组来表示1~N这些数的是否为质数的状态,然后通过遍历数组并对其状态进行处理来找出所有的素数。具体实现方法可以分为两类,分别是埃氏筛法和欧拉筛法。
2. 埃氏筛法
埃氏筛法的核心思想是,对于一个素数p,可以将小于等于N 中可以被p整除的数全部排除掉。例如,对于素数2,我们需要把4、6、8……都去掉,再对素数3进行筛选时,需要去掉9、12、15……以此类推。
实现时,我们可以先定义一个长度为N的bool类型数组,每个元素默认为true。然后从2开始枚举每个数,如果该数为素数,则将其倍数全部筛除。具体代码如下:
bool isPrime[10001]; // 用于标记素数状态
void eratosthenes(int n) {
memset(isPrime, true, sizeof(isPrime)); // 初始化全部为素数
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * 2; j <= n; j += i) { // 筛除素数i的所有倍数 isPrime[j] = false;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
筛法求素数真的很快,具体有多快?今天测了一下:
求10万以内所有素数,用时0.01秒之内;
求100万以内所有素数,用时0.08秒;
求1000万以内所有素数,用时1.1秒;
求1亿以内所有素数,用时约13秒。
用我那台烂电脑测筛法求素数的效率都如此之高,所以这个……必须要熟练掌握啊!
var i,j,k,n:longint;
l:array[1..1000000]of boolean;
su:array[1..500000]of longint;
begin
k:=0;
fillchar(l,sizeof(l),true);
readln(n);
for i:=2 to trunc(sqrt(n)) do
if l[i] then
for j:=2 to n div i do l[i*j]:=false;
for i:=2 to n do if l[i] then begin
inc(k);
su[k]:=i;
end;
writeln(k);
for i:=1 to k do write(su[i]:8);
end.