Trouver les nombres premiers d'un intervalle
Perplex.
Messages postés
20
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonsoir,
alors en faite je suis débutant en programmation (C sur CodeBlocks) et j'ai un petit exo qui permet d'afficher tout les nombres premiers d'un intervalle.
Donc en gros ce que j'ai fais c'est qu'à l'intérieur de mon main qui scan les valeurs, j'appelle une fonction avec un for qui reprend les bornes de l'intervalle et j'envois le i de ma boucle à une autre fonction qui détermine si ce i est premier en faisant le modulo pour toutes les valeurs qui le précède.
Donc Je suis censé avoir les bornes envoyés dans une boucle, puis le i par pas de 1 envoyé lui-même à être testé premier ou pas, et le tout affiché.
Mais rien ne ce passe dans ma console...
Voici mon programme :
J'ai omis de faire la vérification des bornes a<b et a>1 car je sais le faire je le ferais dès lors que mon programme affichera bien les valeurs.
Merci bien :D
alors en faite je suis débutant en programmation (C sur CodeBlocks) et j'ai un petit exo qui permet d'afficher tout les nombres premiers d'un intervalle.
Donc en gros ce que j'ai fais c'est qu'à l'intérieur de mon main qui scan les valeurs, j'appelle une fonction avec un for qui reprend les bornes de l'intervalle et j'envois le i de ma boucle à une autre fonction qui détermine si ce i est premier en faisant le modulo pour toutes les valeurs qui le précède.
Donc Je suis censé avoir les bornes envoyés dans une boucle, puis le i par pas de 1 envoyé lui-même à être testé premier ou pas, et le tout affiché.
Mais rien ne ce passe dans ma console...
Voici mon programme :
#include <stdio.h>
#include <stdlib.h>
void premier (short int a,short int b);
void modulo (short int i);
int main(void)
{
short int a,b;
printf("\nEntre la borne superieur de l'intervalle.");
scanf("%hd",&a);
printf("\nEntre la borne inferieur de l'intervalle.");
scanf("%hd",&b);
premier(a,b);
return 0;
}
void premier(short int a, short int b)
{
short int i,z;
z=0;
for(i>=a;i<=b;i++)
{
modulo(i);
}
}
void modulo (short int i)
{
short int z,m;
z=0;
for(m=1;m<=i;m++)
{
if(i%m==0)
{
z++;
if(z==2)
{
printf("\t %hd",i);
}
}
}
}
J'ai omis de faire la vérification des bornes a<b et a>1 car je sais le faire je le ferais dès lors que mon programme affichera bien les valeurs.
Merci bien :D
A voir également:
- Trouver les nombres premiers d'un intervalle
- Trouver adresse mac - Guide
- Trouver un film sans le titre - Télécharger - Divers TV & Vidéo
- Comment trouver le mot de passe wifi sur son téléphone - Guide
- Ou trouver l'adresse ip - Guide
- Trouver mon adresse exacte - Guide
3 réponses
bonjour
Attention ,
Tu commences avec m=1, mais le reste de la division par 1 est toujours 0. Donc ton
Enfin, quelle drôle d'idée de mettre du "short" partout, mais ça, ce n'est pas un problème.
Le père (pas plex)
for(i>=a;i<=b;i++)
Attention ,
i>=an'initialise pas i. C'est juste un test, dont le résultat n'est pas utilisé. Je suppose que tu voulais écrire :
for (i=a;....
for(m=1;m<=i;m++) { if(i%m==0)
Tu commences avec m=1, mais le reste de la division par 1 est toujours 0. Donc ton
if(i%m==0)sera toujours vrai pour m=1. Autant commencer ta boucle à 2 après avoir initialisé z à 1.
if(z==2)À l'endroit où tu as mis ce test, tu as afficher i dès que tu auras trouvé le second diviseur, même s'il y en a une demi-douzaine d'autres. Il faut attendre d'avoir testé tous les diviseurs potentiels avant de tirer une conclusion.
Enfin, quelle drôle d'idée de mettre du "short" partout, mais ça, ce n'est pas un problème.
Le père (pas plex)
Bonjour,
Original comme façon de faire :-). Généralement, on se fait une fonction estPremier() et on l'applique sur tous les nombres de l'intervalle.
Mais pourquoi pas. Par contre le nom des fonctions ne correspond pas très bien à son contenu. Pourquoi mettre des shorts partout au lieu de int ?
Sinon, le problème vient de la fonction modulo().
En l'état, tu n'affiches pas que les nombres premiers mais tous les nombres. Et certains plusieurs fois.
Par exemple, imagine que tu testes le nombre 10.
10%1 => 0 => z=1
10%2 => 0 => z=2 donc on affiche 10...
10%3 => 1 => z=2 donc on affiche 10...
etc.
Le if(z==2) ne doit pas être dans la boucle for.
Cdlt,
Original comme façon de faire :-). Généralement, on se fait une fonction estPremier() et on l'applique sur tous les nombres de l'intervalle.
Mais pourquoi pas. Par contre le nom des fonctions ne correspond pas très bien à son contenu. Pourquoi mettre des shorts partout au lieu de int ?
Sinon, le problème vient de la fonction modulo().
En l'état, tu n'affiches pas que les nombres premiers mais tous les nombres. Et certains plusieurs fois.
Par exemple, imagine que tu testes le nombre 10.
10%1 => 0 => z=1
10%2 => 0 => z=2 donc on affiche 10...
10%3 => 1 => z=2 donc on affiche 10...
etc.
Le if(z==2) ne doit pas être dans la boucle for.
Cdlt,
Bonjour, bon mon problème est résolu grâce à vos deux réponses bien complètes!
Donc c'est un exo où je dois utiliser des fonctions avec entrées et mais sans sorties du coup après m'être creusé la tête pour savoir comment faire un modulo "automatique", c'est à dire sans rentrer un N soit même et afficher si il est premier ou pas mais dans un intervalle, je me suis dit que je vais envoyer mon i dans une autre fonction le tester premier ou pas.
Donc sinon je suis preneur pour ta méthode afin d'avoir plusieurs idées
Pour les noms des fonctions je t'avoue que j'étais plutôt centré sur la méthode pas trop la mise en forme.
Enfin pour l'histoire des shorts je veux bien que vous m'éclairiez du coup ...
Merci encore!
Donc c'est un exo où je dois utiliser des fonctions avec entrées et mais sans sorties du coup après m'être creusé la tête pour savoir comment faire un modulo "automatique", c'est à dire sans rentrer un N soit même et afficher si il est premier ou pas mais dans un intervalle, je me suis dit que je vais envoyer mon i dans une autre fonction le tester premier ou pas.
Donc sinon je suis preneur pour ta méthode afin d'avoir plusieurs idées
Pour les noms des fonctions je t'avoue que j'étais plutôt centré sur la méthode pas trop la mise en forme.
Enfin pour l'histoire des shorts je veux bien que vous m'éclairiez du coup ...
Merci encore!
Oui, j'magine pour la mise en forme. Mais, cela permet d'y voir plus clair et finalement, ça te fait gagner du temps. Beaucoup de personnes n'indentent pas et quand on leur demande de le faire, elles voient certaines fautes :-).
Sinon pour l'idée, classiquement on fait plutôt :
Pour char, le père semble avoir tout dit :-).
Sinon pour l'idée, classiquement on fait plutôt :
#include ... int estPremier(const int nb) { /*ici tu mets ton code pour savoir si le nombre est premier*/ /*s'il n'est pas premier, alors on renvoie 0*/ return 0; } int main(void) { int min, max; scanf("%d", ...); scanf(...); if (b>a) { int i; for(i=...; i<...; i++) { if (estPremier(...)) { printf("%d, ", ...); } } } return 0; }
Pour char, le père semble avoir tout dit :-).
Après j'ai modifié pour le m=2 et z=1 enfin bon c'est pareil mais c'est vrai que c'est plus logique.
Et pour finir l'histoire du short j'ai pas compris ? Je met short int car c'est un entier court, je sais pas tu aurais mis quoi ?
Merci encore!
Par contre pourrais-tu juste m'expliquer les chars etc.. car je ne vois pas la différence entre ces formats.
À titre d'exemple, si c'est pour printf :
http://www.cplusplus.com/reference/cstdio/printf/
C'est du C++, mais ça doit s'appliquer au C aussi