salut tout le monde
j'ai essayé de fair un programme qui consiste a afficher les nombres premiers de 1 a 100 mais il parait que j'ai un probleme dans mon code puisqu'il m'affiche des nombres qui sont devisable je souhaite que vous jetez un coup d'oeil sur mon programme afin de trouver la solution merci infiniment
#include <stdio.h>
#include <stdlib.h>
int main()
{
int r = 0;
int i,j;
printf("nombre premier : 2\n");
for ( i = 3 ; i < 100 ; i++)
{
for ( j = i-1; j > 1 ; j--)
{
r = i % j;
if( r == 0 )
{
i = i + 1;
}
}
printf("nombre premier : %ld\n", i);
}
return 0;
}
un nombre premier est un nombre dont aucun nombre inferieure ou egal a sa racine carrée ne le divise, ainsi tu fais une boucle pour ce test, et si le modulo est <>0 alors tu affiche le nombre, et c'est tout.
en passant tu veux qu'on t'aide a reussir a le resoudre par toi meme ou tu veux une correction, dans ce cas je met le code corrige , alors la reponse?
Il a sans doute oublié "excepté 1"... mais aucune nombre supérieur à n ne peut être diviseur de n, et si il n'existe aucun diviseur de n compris entre 2 et racine(n), il n'existe aucun diviseur de n compris entre racine(n) et n - 1.
Donc ce qu'il dit n'est pas tout à fait inexact.
un nombre premier est un nombre dont aucun nombre inferieure ou egal a sa racine carrée ne le divise
Oh!!!
Un nombre premier est un nombre qui admet en tant que diviseurs lui-même et 1... cf.Wikipedia.
Mon prof de maths dit que un nombre premier est un nombre qui a seulement 2 diviseurs, donc 1 n'est pas premier
car 1 a pour diviseur 1 et c'est qu'un seul diviseur.
Mais je me mouilles pas, c'est selon mon prof de maths.
je suis daccord avec vous tout les nombres premiers en que deux diviseurs, eux memes et 1 donc comment peut on faire un programme qui va nous afficher tout les nombre premiers de 1 a 100 par exemple
Facile, il suffit simplement d'implementer l'algorithme de factorisation par crible sur les corps de nombres généralisé
Plus serieusement l'algo naif (le plus simple et le moins optimisé) est le suivant
int estPremier(int n)
{
if (n == 1) // cas particulier
{
return 0;
}
int i;
for ( i=2; i<n; i++) // on va tester tout les nombres entre 1 et n
{
if ( n%i == 0 ) // si ce nombre divise n
{
return 0; // n n'est pas premier
}
}
return 1; // n est premier, car on n'a pas trouvé de diviseurs
}
void afficherPremiers(int n)
{
int i;
for (i=1; i<=n ; i++) // on teste chaque entier entre 1 et n
{
if ( estPremier(i) )
{
afficher i;
}
}
}
Après il existe quelques optimisations faciles a realiser:
- tout nombre premier superieur a 2 est impair
=> divise par 2 le temps d'execution du programme
- si 2 n'est pas un diviseur de n, alors tout les diviseurs de n sont impairs
=> divise encore par 2 le temps d'execution du programme
- si un nombre n'est pas premier, il peut s'ecrire sous la forme n = a * b, en supposant a <= b, on a n >= a * a. Ce qui veut dire que si on a i*i > n et que l'on n'a pas trouvé de diviseurs de n plus petit que i, alors n est premier
trés interessant ton code je vais l'etudier et le bien comprendre merci infiniment a toi je vais bientot te repondre
nombre premier
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !