Project Euler Problem 50 Solution
Problem Description :
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?
Solution :
First we have to generate prime numbers up to 1 million. Using Sieve we can generate prime table easily. When we have these primes we can have the solution using n^2 loop where n is the number of primes bellow 1 million.
Here is the C++ implementation of this problem.
#include <cstdio>
#include <iostream>
using namespace std;
#define sz 1000001
#define hi 1001
bool prime[sz];
long primeTable[78500],nPrime,sum[78500];
void sieve(){
int i,j;
for( i=4; i < sz ;i += 2)
prime[i] = true;
primeTable[nPrime++] = 2;
for( i=3; i <= hi;i += 2){
if(!prime[i]){
primeTable[nPrime++] = i;
for(j = i+i; j < sz; j += i)
prime[j] = true;
}
}
for( i= hi+2; i < sz; i += 2)
if(!prime[i])
primeTable[nPrime++] = i;
}
long findSum(long I,long J){
long summ = 0;
for(int i = I; i < J; i++){
summ += primeTable[i];
if(summ > sz)
return 0;
}
return summ;
}
int main(){
long i,j,k,l,tmp,max,ans;
sieve();
max = ans = 0;
for(i = 0; i < nPrime; i++){
tmp = 0;
for(j = i; j < nPrime; j++){
tmp += primeTable[j];
if( tmp >= sz){
//i = j-1;
break;
}
if(!prime[tmp] && (j-i+1) > max){
max = j-i+1;
ans = tmp;
}
}
}
printf("%ld %ld\n",ans,max);
return 0;
}

No comments:
Post a Comment