project euler 50

Problem 50


Consecutive prime sum

The prime 41, can be written as the sum of six consecutive primes:

41 = 2 + 3 + 5 + 7 + 11 + 13

This is the longest sum of consecutive primes that adds to a prime below one-hundred.

The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953.

Which prime, below one-million, can be written as the sum of the most consecutive primes?


连续素数的和

素数41可以写成六个连续素数的和:

41 = 2 + 3 + 5 + 7 + 11 + 13

在小于一百的素数中,41能够被写成最多的连续素数的和。

在小于一千的素数中,953能够被写成最多的连续素数的和,共包含连续21个素数。

在小于一百万的素数中,哪个素数能够被写成最多的连续素数的和?

public static final SimpleDateFormat sdf = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");

	@Test
	public void testCase() {

		getLongest(1000000);

	}

	void getLongest(int upLimit) {

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

		for (int i = 2; i <= upLimit; i++) {
			if (isPrime((long) i)) {
				primeList.add(i);
			}
		}

		int start = 0;
		int end = 0;
		int count = 0;
		Long sum = 0L;

		Long allSum = 0L;
		for (int i = 0; i < primeList.size(); i++) {
			allSum += primeList.get(i);
		}

		allSum += primeList.get(0);

		for (int i = 0; i < primeList.size(); i++) {
			if (i == 0) {
				allSum -= primeList.get(0);
			} else {
				allSum -= primeList.get(i - 1);
			}
			sum = allSum;
			int j = primeList.size() - 1;
			while (sum >= upLimit) {
				sum -= primeList.get(j--);
			}

			for (; j > i; j--) {

				if (isPrime(sum)) {
					assert (sum < upLimit);

					if (count < j - i + 1) {
						start = i;
						count = j - i + 1;
						end = j;
					}
					break;
				} else {
					// if( sum % 2 == 0){
					// if( j > i){
					// sum -= primeList.get(j);
					// }
					// j = j - 1;
					// }
					//
					// if( j > i){
					// sum -= primeList.get(j);
					// }
					// j = j - 1;
					// if( j > i){
					// sum -= primeList.get(j);
					// }
					// j = j - 1;

					sum -= primeList.get(j);
					if (count > j - i + 1) {
						break;
					}
				}

			}
		}

		sum = 0L;
		for (int i = start; i <= end; i++) {
			System.out.print(primeList.get(i) + ",");
			sum += primeList.get(i);
		}
		System.out.println();
		System.out.println("sum=" + sum + ", count=" + count + ","
				+ isPrime(sum));
	}

	public static boolean isPrime(Long num) {

		long val = Math.abs(num);
		if (val <= 10) {
			if (val == 2 || val == 3 || val == 5 || val == 7) {
				return true;
			}
			return false;
		}

		for (int i = 2; i * i <= val; i++) {
			if (val % i == 0) {
				return false;
			}
		}
		return true;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值