Trouver les nombres premiers d'un intervalle

Fermé
Perplex. Messages postés 20 Date d'inscription mercredi 3 septembre 2014 Statut Membre Dernière intervention 16 octobre 2014 - Modifié par Perplex. le 15/10/2014 à 20:31
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 oct. 2014 à 21:08
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 :

#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



3 réponses

Utilisateur anonyme
15 oct. 2014 à 21:52
bonjour

    for(i>=a;i<=b;i++)

Attention ,
i>=a
n'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)
0
Perplex. Messages postés 20 Date d'inscription mercredi 3 septembre 2014 Statut Membre Dernière intervention 16 octobre 2014
Modifié par Perplex. le 16/10/2014 à 13:18
Merciiiiiii, j'ai réussi du coup, mon problème majeur venait du fait de l'initialisation de mon i, en effet c'était idiot il ne s'initialisait pas...
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!
0
Utilisateur anonyme
16 oct. 2014 à 13:38
Le short int n'est pas du tout interdit, il est juste inhabituel. À ta place, j'aurais simplement mis int (et %d à la place des %hd). Mais ça peut très bien marcher avec des short int, tu es juste limité à des nombres plus petits (et encore, ça dépend des compilateurs).
0
Perplex. Messages postés 20 Date d'inscription mercredi 3 septembre 2014 Statut Membre Dernière intervention 16 octobre 2014
Modifié par Perplex. le 16/10/2014 à 13:42
C'est par rapport au nombre de bits que ça prend je crois, enfin bon c'est vrai que sur du code basique sur un pc, économiser 16 bits ne sert à rien ^^.

Par contre pourrais-tu juste m'expliquer les chars etc.. car je ne vois pas la différence entre ces formats.
0
Utilisateur anonyme
16 oct. 2014 à 13:47
Qu'entends-tu par 'expliquer les chars' ? Tu veux connaître les différnts types de données offerts par le C ? Ou tu t'intéresses aux chaînes de formatages utilisées dans scanf et printf ?
À 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
0
Perplex. Messages postés 20 Date d'inscription mercredi 3 septembre 2014 Statut Membre Dernière intervention 16 octobre 2014
16 oct. 2014 à 13:54
En fait, j'ai vu que pour l'utilisation d'une variable décimale on met float, un entier c'est short/long int et les unsigned, puis char je ne sais pas à quoi ça sert ...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
15 oct. 2014 à 21:52
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,
0
Perplex. Messages postés 20 Date d'inscription mercredi 3 septembre 2014 Statut Membre Dernière intervention 16 octobre 2014
16 oct. 2014 à 13:24
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!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
16 oct. 2014 à 21:08
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 :
#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 :-).
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
16 oct. 2014 à 18:19
Bonjour
Je me pose une petite question, c'est bien beau de trouver les nombres premiers dans une intervalles mais quand est-il si dans cet intervalle se trouve un nombre composer ?
Vu le code je doute "fort" :) qu'on obtienne des résultats valide
à bientôt
0