Eratoshenes 筛选素数算法

 

       我们知道,利用Java平台的位集BitSet类存放位序列比较高效,因为该位集是将各个位包装在字节中的。BitSet类使用起来也很方便,因为它提供了

对各个位进行读取、设置或者清除等操作接口。利用这些接口,可以避免屏蔽以及其他麻烦的位操作。

      利用BitSet类,Eratoshenes 筛选素数的方法的主要思路是():

1、首先打开所有的位;

2、将素数倍数的所有位都关闭;

3、经过1与2操作之后保留下来的那些位的位置就是素数。

import java.util.*;

/**
 * This program runs the Sieve of Eratosthenes banchmark. It computes all primes
 * up to 2,000,000.
 * 
 */
public class Sieve {
	public static void main(String[] args) {
		int n = 2000000;// 这里只筛选2~2000000之间的素数
		long start = System.currentTimeMillis();// 开始计时
		BitSet b = new BitSet(n + 1);// 因为BitSet是从0开始计数的,所以包括n在内应该加1
		int count = 0;// 用于记录素数的个数

		/**
		 * 首先打开所有的位
		 */
		int i;
		for (i = 2; i <= n; i++) {
			b.set(i);
		}

		/**
		 * 将素数倍数的所有位都关闭
		 */
		i = 2;
		while (i * i <= n) {//只要试验n的开方次就足够了
			if (b.get(i)) {
				count++;
				int k=2*i;
				/**
				 * i=2时,k=4,6,8,……第一轮即把所有偶数位置上的位调至”关“的状态
				 * i=3时,k=6,9,12,……
				 */
				while(k<=n){
					b.clear(k);
					k+=i;
				}
			}
			i++;
		}

		/**
		 * 计数剩下的素数
		 */
		while(i<=n){
			if(b.get(i))
				count++;
			i++;
		}
		
		long end=System.currentTimeMillis();
		System.out.println(count+" primes");
		System.out.println((end-start)+" milliseconds");
	}
}

 

运行结果:

148933 primes
250 milliseconds

 

 

你可能感兴趣的:(Eratoshenes 筛选素数算法)