埃拉托斯特尼筛法
特性:将所有不大于根号n的素数的倍数筛去,剩下的就是素数。O(n*log(logn)) 代码实现:
import java. util. BitSet;
import java. util. Scanner;
public class Main {
public static void main ( String[ ] args) {
BitSet flag = new BitSet ( ) ;
int count = 0 ;
Scanner sc = new Scanner ( System. in) ;
int n = sc. nextInt ( ) ;
int k = ( int ) Math. sqrt ( n) + 1 ;
for ( int i = 2 ; i <= k; i++ ) {
if ( ! flag. get ( i) ) {
for ( int j = 2 ; i * j <= n; j++ ) {
flag. set ( i * j) ;
}
}
}
for ( int i = 2 ; i <= n; i++ ) {
if ( ! flag. get ( i) ) {
count++ ;
}
}
System. out. print ( count) ;
}
}
线性(欧拉)筛法
特性:由于埃氏筛法会重复筛去因数相同的合数。因此,只根据最小质因数来进行筛选。O(n) 代码:
import java. util. BitSet;
import java. util. Scanner;
public class Main {
public static void main ( String[ ] args) {
BitSet flag = new BitSet ( ) ;
Scanner sc = new Scanner ( System. in) ;
int count = 0 ;
int n = sc. nextInt ( ) ;
int [ ] primeArray = new int [ n] ;
for ( int i = 2 ; i <= n; i++ ) {
if ( ! flag. get ( i) )
primeArray[ count++ ] = i;
for ( int j = 0 ; j <= count && primeArray[ j] * i <= n; j++ ) {
flag. set ( i * primeArray[ j] ) ;
if ( i % primeArray[ j] == 0 )
break ;
}
}
System. out. print ( count) ;
}
}