素数的判断其实谁都会,所以这篇跳过简单的素数判断,直接学习如何快速判断1到N的素数,以及判断大数据是否为素数。
(1)埃氏筛法
现在我们先学习埃氏筛选法,此法实用与大规模判断素数,比如1到N的素数有那些啊,等等等等。
这个算法流弊哦,与辗转相除法一样古老哇。
首先,将2到n范围内的所有整数写下来。其中最小的数字2是素数,将表中2的倍数都划去。表中剩余的最小数字是3,不能被更小的数整除,是素数。如果表中最小的是m,m为素数,将m的倍数划去。
附上表格学习:
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2 | 3 | - | 5 | - | 7 | - | 9 | - | 11 | - |
| 2 | 3 | - | 5 | - | 7 | - | - | - | 11 | - |
#include<stdio.h> #define MAX 1000000 bool is[MAX];///判断 int pr[MAX];///储存素数 ///返回1到n有多少个素数,以及储存 int sieve(int n) { int p=0; ///初始化让他们高兴一下先 for(int i=0 ; i<=n ;i++) is[i]=true; is[0]=is[1]=false;///根本都不是自己人 for(int i=2 ; i<=n ; i++) { ///如果是自己人 if(is[i]) { ///我就记录咯 pr[++p]=i; ///那现在就很明显了,关于自己人I的倍数都不是自己人了 for(int j=i*2 ; j<=n ; j+=i) is[j]=false; } } return p; } int main() { int n; scanf("%d",&n); printf("%d\n",sieve(n)); return 0; }