Défi final
Dans ce défi, notre but est d'implémenter le Crible d'Ératosthène. Cet algorithme imaginé par Ératosthène (un savant grec antique) permet de trouver tous les nombres premiers inférieurs à un certain nombre. Un nombre premier est un nombre qui n'est divisible que par 1 et lui-même, comme 5, 7 ou 31. Nous allons implémenter pas à pas son algorithme :
limite = ?
L = liste des entiers de 2 à limite
primeNumbers = []
Tant que L est non vide faire:
Ajouter L[0] à nbPremiers
i prend la valeur 1
Tant que i < longueur(L) faire:
Si L[i] est multiple de L[0]:
Enlever L[i] de L
Sinon:
Incrémenter i
FinSi
FinTantQue
Retirer le premier élément de L
FinTantQue
Afficher nbPremiers
Cet algorithme consiste à regarder, pour chaque entier à une position donnée, s'il est multiple d'un entier qui le précède. Si oui, il est éliminé de la liste car il n'est pas premier.
Voici le squelette que nous allons compléter petit à petit :
const limit = Number(prompt('Entrer la limite du crible'))
// Liste des premiers nombres entiers jusqu'à limit
const L = []
for (let i = 2; i <= limit; i++) {
L.push(i)
}
const primeNumbers = []
while (/* A Compléter */) {
// A compléter
}
console.log(primeNumbers)
Question
Question
Traduire les premières lignes du while
, rappelées ci-dessous. Pour ajouter un élément à une liste, il faut faire liste.push(element)
.
Ajouter L[0] à primeNumbers
i prend la valeur 1
Solution
primeNumbers.push(L[0])
i = 1
Question
Voici le squelette de la boucle imbriquée, complétez-le :
while(?) {
if (?) {
?
} else {
?
}
}
Indice
Pour retirer le i-ème élément d'une liste il faut écrire liste.splice(i, 1)
.
Indice
Pour incrémenter une variable entier
, il faut écrire entier++
.
Indice
Pour vérifier si b est multiple de a, il est possible d'écrire la condition suivante : a % b === 0
.
Solution
while(i < L.length) {
if (L[i] % L[0] === 0) {
L.splice(i, 1)
} else {
i++
}
}
Question
Donner le programme complet :
Solution
const limit = Number(prompt('Entrer la limite du crible'))
const L = []
for (let i = 2; i <= limit; i++) {
L.push(i)
}
const primeNumbers = []
while (L.length > 0) {
primeNumbers.push(L[0])
let i = 1
while (i < L.length) {
if (L[i] % L[0] === 0) {
L.splice(i, 1)
} else {
i++
}
}
L.splice(0, 1)
}
console.log(primeNumbers)
Question
Quel est le résultat de l'algorithme pour n = 50 ?
Solution
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]