96 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | id: 5900f39e1000cf542c50feb1 | ||
|  | title: 'Problem 50: Consecutive prime sum' | ||
|  | challengeType: 5 | ||
|  | forumTopicId: 302161 | ||
|  | dashedName: problem-50-consecutive-prime-sum | ||
|  | --- | ||
|  | 
 | ||
|  | # --description--
 | ||
|  | 
 | ||
|  | The prime 41, can be written as the sum of six consecutive primes: | ||
|  | 
 | ||
|  | <div style='text-align: center;'>41 = 2 + 3 + 5 + 7 + 11 + 13</div> | ||
|  | 
 | ||
|  | 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? | ||
|  | 
 | ||
|  | # --hints--
 | ||
|  | 
 | ||
|  | `consecutivePrimeSum(1000)` should return a number. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert(typeof consecutivePrimeSum(1000) === 'number'); | ||
|  | ``` | ||
|  | 
 | ||
|  | `consecutivePrimeSum(1000)` should return 953. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert.strictEqual(consecutivePrimeSum(1000), 953); | ||
|  | ``` | ||
|  | 
 | ||
|  | `consecutivePrimeSum(1000000)` should return 997651. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert.strictEqual(consecutivePrimeSum(1000000), 997651); | ||
|  | ``` | ||
|  | 
 | ||
|  | # --seed--
 | ||
|  | 
 | ||
|  | ## --seed-contents--
 | ||
|  | 
 | ||
|  | ```js | ||
|  | function consecutivePrimeSum(limit) { | ||
|  | 
 | ||
|  |   return true; | ||
|  | } | ||
|  | 
 | ||
|  | consecutivePrimeSum(1000000); | ||
|  | ``` | ||
|  | 
 | ||
|  | # --solutions--
 | ||
|  | 
 | ||
|  | ```js | ||
|  | function consecutivePrimeSum(limit) { | ||
|  |   function isPrime(num) { | ||
|  |     if (num < 2) { | ||
|  |       return false; | ||
|  |     } else if (num === 2) { | ||
|  |       return true; | ||
|  |     } | ||
|  |     const sqrtOfNum = Math.floor(num ** 0.5); | ||
|  |     for (let i = 2; i <= sqrtOfNum + 1; i++) { | ||
|  |       if (num % i === 0) { | ||
|  |         return false; | ||
|  |       } | ||
|  |     } | ||
|  |     return true; | ||
|  |   } | ||
|  |   function getPrimes(limit) { | ||
|  |     const primes = []; | ||
|  |     for (let i = 0; i <= limit; i++) { | ||
|  |       if (isPrime(i)) primes.push(i); | ||
|  |     } | ||
|  |     return primes; | ||
|  |   } | ||
|  | 
 | ||
|  |   const primes = getPrimes(limit); | ||
|  |   let primeSum = [...primes]; | ||
|  |   primeSum.reduce((acc, n, i) => { | ||
|  |     primeSum[i] += acc; | ||
|  |     return acc += n; | ||
|  |   }, 0); | ||
|  | 
 | ||
|  |   for (let j = primeSum.length - 1; j >= 0; j--) { | ||
|  |     for (let i = 0; i < j; i++) { | ||
|  |       const sum = primeSum[j] - primeSum[i]; | ||
|  |       if (sum > limit) break; | ||
|  |       if (isPrime(sum) && primes.indexOf(sum) > -1) return sum; | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | ``` |