Problem 50
Consecutive prime sum
The prime 41, can be written as the sum of six consecutive primes:
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能够被写成最多的连续素数的和。
在小于一千的素数中,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;
}