Envoyé par
haddocks
J'ai un autre tableau:
primes = [ 0, 0, 2, 3, 5, 7 ] // ne pas se préoccuper des 0, je ne m'en sert pas pour l'instant.
Mauvaise idée, car le nom que tu donnes à ton tableau ne correspond pas à son contenu (à cause des 0 dont il ne faut pas se préoccuper justement). Tu aurais tout intérêt à avoir un tableau primes avec effectivement les nombres premiers:
const primes = [2, 3, 5, 7];
Puis, si par la suite tu as besoin d'un tableau commençant par 0, 0 suivi des nombres premiers, tu lui trouves un nom descriptif adéquate et tu peux le composer facilement comme ceci:
let nomdescriptif = [0, 0, ...primes];
L'avantage, en plus de la clarté, c'est que tu pourras remplacer ta boucle for (let k = 2; k <= primes.length; k++) avec un 2 parachuté tout droit de l'espace, par une boucle for...of: for (const prime of primes). Ainsi dans la suite du code, plus besoin d'écrire primes[k], plus besoin de k non plus, il suffit d'écrire prime.
Enfin lorsque
6 % 2 == 1, il sortirait de la boucle en faisant un PUSH de la valeur du compteur dans le dernier tableau de divideBy.
Pour une liste de 2 à 6 voila ce que ça donnerait au final:
Au vu du résultat attendu, je pense que les conditions pour sortir de la boucle (celle sur les nombres premiers) sont plutôt:- soit n2 === 1 (ce qui implique que n ne sera divisible par aucun des nombres premiers suivants celui qui vient d'être testé).
- soit lorsque le nombre premier est supérieur à n (même combat).
Mais je reste persuadé qu'il y a une unique condition (qui regroupe les deux pré-citées) plus maline qu'il reste à trouver.
dividedBy[dividedBy.length-1].push(compte)
Astuce: plutôt que de t'escrimer à calculer l'index du dernier élément de dividedBy pour pouvoir lui ajouter un nombre, crée un tableau temporaire dans ta boucle sur n, que tu ajoutes ensuite à dividedBy. C'est plus simple et plus lisible:
1 2 3 4 5 6 7 8 9 10 11 12 13
| for( let n=min; n<=max; n++ ) {
let temp = [0, 0];
for(const prime of primes) {
// ...
temp.push(count);
if ( n2 === 1 || n < prime ) break;
}
dividedBy.push(temp);
} |
(J'ai remplacé compte par count comme ça j'ai l'impression d'être super fort en anglais, tu vas voir, essaie, ça marche!)
Autre astuce: comme tu utilises un compteur compte et une boucle while, tu peux aussi opter pour une boucle for qui se chargera d'initialiser puis d'incrémenter le compteur, mais dont la condition d'arrêt sera celle de la boucle while (en effet aussi étrange que cela puisse paraître, rien n'oblige à ce que la condition d'une boucle for porte sur la variable qu'elle initialise).
1 2 3 4 5 6 7
| let n2 = n, count; // important: la variable count doit être déclarer ici et pas dans la boucle for
for (count=0; n2 % prime === 0; count++) {
n2 /= prime;
}
temp.push(count); // pour qu'elle existe ici (et pas juste dans la boucle for) |
Partager