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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值