project euler 10

本文介绍了一个Java程序,用于计算所有小于两百万的素数之和。通过使用BitSet进行高效筛选,该程序实现了埃拉托斯特尼筛法,并展示了如何生成素数列表及其总和。

Problem 10


Summation of primes

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.


素数的和

所有小于10的素数的和是2 + 3 + 5 + 7 = 17。

求所有小于两百万的素数的和。

package projecteuler;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;

import org.junit.Test;

public class Prj10 {

	/**
	 * The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
	 * 
	 * Find the sum of all the primes below two million.
	 */
	@Test
	public void test() {
		
		PrimeMaster mt = new PrimeMaster().calcultePrimeList(2000000);
		
		System.out.println(mt.toString());
		System.out.println(mt.sum);
		
		
	}
	
	
	public static class PrimeMaster {

		public List<Integer> primeList = new ArrayList<Integer>();

		
		public Long sum = 0L;
		
		
		public PrimeMaster calcultePrimeList(int upLimit ) {

			primeList.clear();

			BitSet bs = new BitSet(upLimit);

			boolean init = true;

			while (true) {
				int val = getNonSetVal(init, bs, primeList, upLimit);
				init = false;

				for (int i = val + 1; i < upLimit; i++) {
					if (i % val == 0) {
						bs.set(i);
					}
					
				}
				
				System.out.println( " val =" + val);

				if (val < 0) {
					break;
				}
			}

			for (int i = 2; i < upLimit; i++) {

				if (!bs.get(i)) {
					primeList.add(i);
				}
			}

			return this;
		}

		private int getNonSetVal(boolean init, BitSet bs,
				List<Integer> primeList_, int upLimit) {

			if (init) {
				primeList_.add(2);
				bs.set(2);
				return 2;
			}

			for (int i = 3; i < upLimit; i++) {
				if (!bs.get(i)) {
					bs.set(i);
					primeList_.add(i);
					return i;
				}
			}
			return -1;
		}

		@Override
		public String toString() {

			Long sum = 0L;
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < primeList.size(); i++) {
				if( ( i + 1 ) % 20 == 0){
					sb.append("\n");
				}
				sb.append(primeList.get(i) + ",");
				
				sum = sum + primeList.get(i);
			}
			sb.append("\n");
			

			this.sum = sum;
			return sb.toString();
		}

	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值