La fonction suivante (optimisée pour la rapidité) permet de retourner
1
si le paramètre N
est un nombre premier,0
sinon :unsigned char isPrime(unsigned int N)
{
if(N < 2) return 0;
if(N == 2) return 1;
if(N % 2 == 0) return 0;
for(int i=3; (i*i)<=N; i+=2)
if(N % i == 0 ) return 0;
return 1;
}
Le code ci-dessous permet d'afficher tous les nombres premiers entre 0 et 100 :
// Online C compiler to run C program online
#include <stdio.h>
// Fonction qui retourne 1 si N est premier
unsigned char isPrime(unsigned int N)
{
// 0 et 1 ne sont pas premiers
if(N < 2) return 0;
// 2 est premier
if(N == 2) return 1;
// Tous les nombres divisible par 2 sont premiers
if(N % 2 == 0) return 0;
// On parcourt tous les diviseurs impairs entre 3 et racine de N
for(int i=3; (i*i)<=N; i+=2)
// Si i est un diviseur de N, ce n'est pas un nombre premier
if(N % i == 0 ) return 0;
// S'il n'y a pas de diviseur, c'est un nombre premier
return 1;
}
int main() {
unsigned int i
// Boucle qui affiche tous les nombres premiers entre 0 et 100
for (i=0; i<=100; i++)
if (isPrime(i)) printf("%d ", i);
return 0;
}
Le code ci-dessus implémente une fonction en C pour tester si un nombre est premier. La fonction retourne 1
si le nombre est premier et 0
sinon.
unsigned char isPrime(unsigned int N)
Prototype de la fonction :
unsigned char isPrime(unsigned int N)
unsigned char
est utilisé pour retourner un octet (valeur 0 ou 1), où 0 indique que le nombre n'est pas premier, et 1 indique qu'il est premier.N
est un entier non signé (unsigned int
) représentant le nombre à tester.Cas des nombres inférieurs à 2 :
if(N < 2) return 0;
N
est inférieur à 2, la fonction retourne immédiatement 0
, car ces nombres (0 et 1) ne sont pas premiers.Cas du nombre 2 :
if(N == 2) return 1;
N
est égal à 2, la fonction retourne immédiatement 1
, car 2 est un nombre premier.Test de divisibilité par 2 :
if(N % 2 == 0) return 0;
N
est pair et différent de 2 (ce qui est vérifié précédemment), il n'est pas premier. Ainsi, si N
est divisible par 2, la fonction retourne 0
.Boucle pour tester les autres diviseurs impairs :
for(int i=3; (i*i)<=N; i+=2)
if(N % i == 0) return 0;
i = 3
(le plus petit nombre impair après 1) et teste les diviseurs impairs.i*i <= N
, c'est-à-dire tant que i
est inférieur ou égal à la racine carrée de N
. Cela permet de réduire le nombre de tests. Si N
a un diviseur d
plus grand que sa racine carrée, alors il aura nécessairement un autre diviseur plus petit.i
est augmentée de 2 à chaque itération (i += 2
), ce qui garantit que seuls les diviseurs impairs sont testés (puisque les nombres pairs ont déjà été éliminés).N
est divisible par un i
quelconque (c'est-à-dire si N % i == 0
), la fonction retourne immédiatement 0
, car cela signifie que N
n'est pas premier.Retour de la fonction :
return 1;
N
est premier, et la fonction retourne 1
.N
, uniquement sur les nombres impairs. Si aucun diviseur n'est trouvé, le nombre est premier.