练习题:计数质数
- 题目要求
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
解:
埃拉托斯特尼筛法(希腊语:κόσκινον Ἐρατοσθένους,英语:sieve of Eratosthenes ),简称埃氏筛,也称素数筛。这是一种简单且历史悠久的筛法,用来找出一定范围内所有的素数。所使用的原理是从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
标出序列中的第一个质数,也就是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
将剩下序列中,划摽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
如果现在这个序列中最大数小于等于最后一个标出的素数的平方,那么剩下的序列中所有的数都是质数,否则回到第二步。
图解:
-----维基百科
代码如下(JAVA):
public int countPrimes(int n) {
if(n==1||n==0){
return 0;
}
int[] a=new int[n];
int count=0;
a[0]=a[1]=0;
for(int i=2;i<n;i++){
a[i]=1;
}
for(int i=2;i<n;i++){
if(a[i]==1){
count++;
if(i*i<=n){
for(int j=2*i;j<n;j+=i){
a[j]=0;
}
}
}
}
return count;
}
来源:leetcode(力扣)