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 :
c#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 :
shgcc -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≤n.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.cbool 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.cint 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 :
cint 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.
Le Chat can make mistakes. Check answers. Learn more