您的位置:首页 > 其它

project euler 50

2015-12-04 21:35 316 查看


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: