Voici une fonction en C qui teste si un nombre est premier en lui cherchant un diviseur, ainsi qu'un programme qui utilise cette fonction pour afficher les 100 premiers nombres premiers :
#include <stdio.h> #include <stdbool.h> // Fonction pour tester si un nombre est premier bool estPremier(int nombre) { if (nombre <= 1) { return false; } for (int i = 2; i * i <= nombre; i++) { if (nombre % i == 0) { return false; } } return true; } int main() { int compteur = 0; int nombre = 2; printf("Les 100 premiers nombres premiers sont :\n"); while (compteur < 100) { if (estPremier(nombre)) { printf("%d ", nombre); compteur++; } nombre++; } return 0; }
Fonction estPremier
:
nombre
en entrée et retourne true
si le nombre est premier, sinon false
.for
vérifie les diviseurs potentiels de 2 à la racine carrée du nombre (i * i <= nombre
). Si un diviseur est trouvé, le nombre n'est pas premier.Fonction main
:
compteur
à 0 pour suivre le nombre de nombres premiers trouvés.nombre
à 2, le premier nombre premier.while
pour trouver les 100 premiers nombres premiers.estPremier(nombre)
retourne true
, le nombre est affiché et le compteur est incrémenté.nombre
à chaque itération pour vérifier le nombre suivant.Pour compiler et exécuter ce programme, vous pouvez utiliser un compilateur C comme gcc
:
gcc -o premiers_nombres_premiers premiers_nombres_premiers.c ./premiers_nombres_premiers
Cela affichera les 100 premiers nombres premiers dans l'ordre.
La condition i * i <= nombre
dans la boucle for
est utilisée pour optimiser la recherche des diviseurs d'un nombre. Voici pourquoi cette condition est liée à la racine carrée du nombre :
Diviseurs d'un nombre :
Racine carrée :
Optimisation :
i * i <= nombre
:i * i <= nombre
est équivalente à .i * i
évite le calcul explicite de la racine carrée, ce qui peut être légèrement plus efficace en termes de performance.Pour le nombre 36 :
En résumé, la condition i * i <= nombre
permet de limiter la recherche des diviseurs aux nombres jusqu'à la racine carrée du nombre, ce qui est une optimisation importante pour déterminer si un nombre est premier.
Dans la fonction estPremier
, la structure du code avec le if
sans else
et le return true
placé après la boucle est conçue pour optimiser la vérification de la primalité d'un nombre. Voici pourquoi cette structure est utilisée :
Vérification des diviseurs :
for
parcourt les nombres de 2 à la racine carrée du nombre (i * i <= nombre
).nombre % i == 0
), le nombre n'est pas premier, et la fonction retourne immédiatement false
.Absence de else
:
if
à l'intérieur de la boucle vérifie si le nombre est divisible par i
. Si c'est le cas, la fonction retourne false
et sort immédiatement.else
ici parce que si un diviseur est trouvé, la fonction se termine immédiatement avec return false
.Placement de return true
:
return true
est placé après la boucle parce que si la boucle se termine sans trouver de diviseur, cela signifie que le nombre est premier.true
.bool estPremier(int nombre) { if (nombre <= 1) { return false; // Les nombres <= 1 ne sont pas premiers } for (int i = 2; i * i <= nombre; i++) { if (nombre % i == 0) { return false; // Si un diviseur est trouvé, le nombre n'est pas premier } } return true; // Si aucun diviseur n'est trouvé, le nombre est premier }
Pour nombre = 11
:
true
.Pour nombre = 12
:
false
dès que le diviseur 2 est trouvé, sans vérifier les autres nombres.En résumé, cette structure permet de sortir de la fonction dès qu'un diviseur est trouvé, ce qui est plus efficace. Le return true
est placé après la boucle pour indiquer que le nombre est premier seulement si aucun diviseur n'a été trouvé.
Dans le programme, une boucle while
est utilisée pour trouver les 100 premiers nombres premiers. Bien que l'on sache que l'on veut aller jusqu'à ce que compteur
soit égal à 100, l'utilisation d'une boucle while
est appropriée dans ce contexte pour plusieurs raisons. Voici pourquoi :
Condition de terminaison basée sur le compteur :
while
continue tant que compteur
est inférieur à 100. Cela signifie que la boucle s'exécutera jusqu'à ce que 100 nombres premiers aient été trouvés.for
est généralement utilisée lorsque le nombre d'itérations est connu à l'avance. Dans ce cas, nous ne savons pas à l'avance combien de nombres nous devons vérifier pour trouver 100 nombres premiers.Incrémentation conditionnelle :
for
était utilisée avec une condition basée sur compteur
, il serait plus complexe de gérer l'incrémentation conditionnelle du compteur.Simplicité et lisibilité :
while
rend le code plus lisible et plus simple à comprendre. La condition compteur < 100
est directement liée à l'objectif de trouver 100 nombres premiers.for
nécessiterait une gestion plus complexe de l'incrémentation du compteur et de la vérification des nombres premiers.int main() { int compteur = 0; // Compteur pour le nombre de nombres premiers trouvés int nombre = 2; // Le premier nombre à vérifier printf("Les 100 premiers nombres premiers sont :\n"); while (compteur < 100) { // Continuer jusqu'à ce que 100 nombres premiers soient trouvés if (estPremier(nombre)) { // Vérifier si le nombre est premier printf("%d ", nombre); // Afficher le nombre premier compteur++; // Incrémenter le compteur } nombre++; // Passer au nombre suivant } return 0; }
for
:Si l'on essayait d'utiliser une boucle for
, cela pourrait ressembler à ceci :
int main() { int compteur = 0; int nombre = 2; printf("Les 100 premiers nombres premiers sont :\n"); for (; compteur < 100; nombre++) { if (estPremier(nombre)) { printf("%d ", nombre); compteur++; } } return 0; }
Cependant, cette version avec une boucle for
est moins intuitive et peut prêter à confusion, car la condition de terminaison (compteur < 100
) et l'incrémentation (nombre++
) ne sont pas directement liées dans la déclaration de la boucle.
En résumé, l'utilisation d'une boucle while
dans ce contexte est plus appropriée car elle permet de gérer facilement la condition de terminaison basée sur le compteur de nombres premiers trouvés, tout en maintenant la simplicité et la lisibilité du code.
This Chat is read-only. Login to resume chatting.