-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathalg13-sumAllPrimes.js
88 lines (77 loc) · 2.51 KB
/
alg13-sumAllPrimes.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const assert = require('assert');
/*
Source: <https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/sum-all-primes>
Sum All Primes
A prime number is a whole number greater than 1 with exactly two divisors: 1 and itself. For example, 2 is a prime number because it is only divisible by 1 and 2. In contrast, 4 is not prime since it is divisible by 1, 2 and 4.
Rewrite sumPrimes so it returns the sum of all prime numbers that are less than or equal to num.
*/
function mySumPrimes(num) {
/* source isPrime(): <https://stackoverflow.com/questions/11966520/how-to-find-prime-numbers-between-0-100?page=1&tab=votes#tab-top> */
const isPrime = (number) => {
if (number < 2) return false;
const squareRootN = Math.floor(Math.sqrt(number));
for (let index = 2; index <= squareRootN; index += 1) {
if (number % index === 0) return false;
}
return true;
}
const primeNumbers = [];
for (let dividend = 0; dividend <= num; dividend += 1) {
if (isPrime(dividend)) primeNumbers.push(dividend);
}
return primeNumbers.reduce((acc, curr) => acc + curr);
}
mySumPrimes(10);
assert.strictEqual(typeof mySumPrimes(10), 'number');
assert.strictEqual(mySumPrimes(10), 17);
assert.strictEqual(mySumPrimes(977), 73156);
/*
Get a help > Get a hint <https://forum.freecodecamp.org/t/freecodecamp-challenge-guide-sum-all-primes/16085>
*/
//Solution 1
function sumPrimes1(num) {
// Helper function to check primality
function isPrime(num) {
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0)
return false;
}
return true;
}
// Check all numbers for primality
let sum = 0;
for (let i = 2; i <= num; i++) {
if (isPrime(i))
sum += i;
}
return sum;
}
//Solution 2
function sumPrimes2(num) {
// Check all numbers for primality
let primes = [];
for (let i = 2; i <= num; i++) {
if (primes.every((prime) => i % prime !== 0))
primes.push(i);
}
return primes.reduce((sum, prime) => sum + prime, 0);
}
//Solution 3
function sumPrimes3(num) {
// Prime number sieve
let isPrime = Array(num + 1).fill(true);
// 0 and 1 are not prime
isPrime[0] = false;
isPrime[1] = false;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (isPrime[i]) {
// i has not been marked false -- it is prime
for (let j = i * i; j <= num; j += i)
isPrime[j] = false;
}
}
// Sum all values still marked prime
return isPrime.reduce(
(sum, prime, index) => prime ? sum + index : sum, 0
);
}