素数:又称为质数。在大于1的自然数中,只能被1和自身整除。
素数有无穷多个。
埃拉托斯特尼筛法能提高筛选素数的效率。
步骤如下:
1-列出2以后的所有序列:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 29 30
2-标出序列中的第一个未标记的素数:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2728 29 30
↑
第一个素数为2。
3-把素数2后面的序列中2的倍数去掉:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2728 29 30
▽
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
▽
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29
4-如果,当前序列中最大的数小于最后一个标出的素数的平方,那么序列中所有数为素数,否则返回第2步:
当前序列中最大的数为29
最后一个标出的素数为2,最后一个标出的素数的平方为22=4
因为 29 ≮4,所以需要重复步骤2。
序列接下来的变化如下:
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29
▽
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29(步骤2)
↑
▽
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29(步骤3)
▽
2 3 5 7 11 13 17 19 23 25 29(步骤3)
▽
29≮9(9=32)(步骤4)
▽
2 3 5 7 11 13 17 19 23 25 29(步骤2)
↑
▽
2 3 5 7 11 13 17 19 23 25 29(步骤3)
▽
2 3 5 7 11 13 17 19 23 29(步骤3)
▽
29≮25(25=52)(步骤4)
▽
2 3 5 7 11 13 17 19 23 29 (步骤2,步骤3 序列中没有7的倍数)
↑
▽
29<49(47=72)(步骤4 结束,序列中的数均为素数)
JAVA实现:
Question:统计找出一千万以内,一共有多少质数
package j2se;
public class Sushu {
public static void main(String[] args) {
int sum = 0;//记录n以内素数的个数
int n;
n=10000000;
double m=Math.sqrt(n+0.5);
//这里加0.5是为了保证步骤4中,最大的数小于最后一个标出的素数的平方
int[] f=new int[n];
f[1]=1;//1不是素数.[再次感谢‘hai1124948893’的提醒]
f[2]=0;//2是素数,所以f[2]=0;
for(int i=2;i<m;i++)
{
if(f[i]==0)//如果f[i]是素数,执行步骤3,去掉后面序列中f[i]的倍数
{
for(int j=i*i;j<n;j=j+i)
//从i*i开始去除,因为比i小的倍数,已经在前面去除过了
//例:i=5
//5的2倍(10),3倍(15),在i=2,i=3的时候,已经去除过了
//所以直接从5的5倍25开始去除,见【序列变化部分的讲解】
{
f[j]=1;//f[j]为合数,所以f[j]=1;
}
}
}
//现在,f[i]中,将f[i]=0的i输出,就为素数
//sum统计素数的个数
for(int i=1;i<n;i++)
{
if(f[i]==0)
{
sum++;
}
}
System.out.println(n+"以内的素数的个数为:"+sum);
}
}
运行结果为:664579