IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Exercice fonction nombre premier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut Exercice fonction nombre premier
    bonjour a tous ,

    Voila j'ia un exercice a faire qui consiste a créer une fonction qui affiche tous les nombre premier inferieur a un nombre n (entré par l'utilisateur )

    voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
     int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)
          {
          return 0;
          }
        else
          {
          for (i = 3 ; i < y; i+=2)
            if (y % i != 0)
              {
               return 0;
              }
            else
              {
               return 1;
              }
          }
    }
    // Fonction qui affiche les nombres premiers inferieur à n
    int premier2 (int x)
    {
        int j,a;
     
        // Boucle permettant de scanner les nombres entre 0 et n
        for (j=1; j<x;j++)
        {
            a = premier(j);
            // Affichage des nombres si ils sont premiers
            if (a == 1)
            {
                printf("%d ",j);
            }
        }
        printf("\n\n");
    }
     
     
    int main(int argc, char *argv[])
    {
    int c;
     
        // Menu de sélection du programme
        printf("******** Exercire I ********\n\n");
        printf("1. Tester si le nombre saisi est premier\n");
        printf("2. Afficher les nombres premiers inferieurs a un nombre n\n");
        printf("3. Afficher les n premiers nombres premiers\n");
        printf("0. Quitter\n");
        scanf("%d",&c);
     
        int n,y;
     
        switch (c)
        {
               case 1 :
                    {
                        printf("\n******** Tester si le nombre saisi est premier ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
     
                        y = premier(n);
     
                        // Affichage du message (traduction de la réponse de la fonction
                        if (y == 0)
                            printf("\n%d n'est pas premier\n\n",n);
                        else
                            printf("%d est premier !!\n",n);
                        system("PAUSE");
                        break;
                    }
                    case 2 :
                    {
                        printf("\n******** Afficher les nombres premiers inferieurs a un nombre n ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
                        printf("\n");
     
                        y = premier2 (n);
     
                        system("PAUSE");
                        break;
                    }
        }
    }
    Quand j'execute mon programme il ne me donne que quelque nombre premier , si quelqu'un peut m'aider a trouver le probleme ca serait cool , merci d'avance

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Deux erreurs dans premier() :

    1- if (y % i != 0) au lieu de if (x % i == 0) : y ->x et != -> ==

    2- Dans la boucle for, on sort de la fonction avec 0 ou 1 dès le premier passage pour i = 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int premier (int x)
    {
       int i,y; 
       if (x % 2 == 0) return 0;
       y = sqrt(x)+1;
       for (i = 3 ; i < y; i += 2)
            if (x % i == 0) return 0;
       return 1;
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut
    Merci pour ton aide , voila ma fonction corriger , le probleme c'est qu'il me laisse encore quelque nombre non premier dans la liste sans que je sache pk ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 0;
            else
               return 1;
          }
          }

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu n'as pas corrigé la seconde erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 0;
          }
          return 1;

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 1;
          }
               return 0;
          }
     
    }
    meme corriger ainsi , il m'affiche des nombre terminant par 5 ( comme 165 ou 195) qui ne sont pas premier

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    les return sont incorrects
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
          {
            if (x % i == 0)
               return 0;
          }
               return 1;
          }
    Attention à ne pas confondre les balises de citation [ quote]...[ /quote] (sans les blancs) et les balises de code [ code]....[ /code] (sans les blancs) (bouton #)

  7. #7
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Comme dit précédemment, dans l'initialisation de ta boucle for:
    for (i = 1 ; i < y; i+=2)//boucle sans les diviseurs paires
    {
    if ((x%i)==0)
    return 0;
    }
    return 1;
    }
    il faut mettre i=3

  8. #8
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Tu pourrais être plus précis?
    Dis nous ce que tu as rentré et ce que le programme t'affiche exactement

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut
    voila mes deux fonctions avec le main . Quand je rentre 199 a pour la 2e fonction , il m'affiche des nombres compris entre 2 et 199 , mais qui ne sont pas premiers .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    int premier (int x)
    {
       int i,y;
     
       y=sqrt(x)+1;
       if (x%2==0)//permet de voir si le nombre est paire ou non
          {
          return 0;
          }
        else
          {
        for (i = 3 ; i < y; i+=2)//boucle sans les diviseurs paires
            {
            if ((x%i)==0)
                return 0;
            }
            return 1;
        }
    }
     
     
     
    // Fonction qui affiche les nombres premiers inferieur à n
    int premier2 (int x)
    {
        int j,a;
     
        // Boucle permettant de scanner les nombres entre 0 et n
        for (j=1; j<x;j++)
        {
            a = premier(j);
            // Affichage des nombres si ils sont premiers
            if (a == 0)
            {
            printf("%d ",j);
            }
        }
        printf("\n\n");
    }
    int main(int argc, char *argv[])
    {
    int c;
     
        // Menu de sélection du programme
        printf("******** Exercire I ********\n\n");
        printf("1. Tester si le nombre saisi est premier\n");
        printf("2. Afficher les nombres premiers inferieurs a un nombre n\n");
        printf("3. Afficher les n premiers nombres premiers\n");
        printf("0. Quitter\n");
        scanf("%d",&c);
     
        int n,y;
     
        switch (c)
        {
               case 1 :
                    {
                        printf("\n******** Tester si le nombre saisi est premier ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
     
                        y = premier(n);
     
                        // Affichage du message (traduction de la réponse de la fonction)
                        if (y == 0)
                            printf("\n%d n'est pas premier\n\n",n);
                        else
                            printf("%d est premier !!\n",n);
                        system("PAUSE");
                        break;
                    }
                    case 2 :
                    {
                        printf("\n******** Afficher les nombres premiers inferieurs a un nombre n ********\n\n");
     
                        // Saisie de la valeur par l'utilisateur
                        printf("Saisissez n : ");
                        scanf("%d",&n);
                        printf("\n");
     
                        y = premier2 (n);
     
                        system("PAUSE");
                        break;
                    }

  10. #10
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Oui donc l'erreur est dans ta fonction premier2()
    Si tu regardes ta nouvelle fonction premier(), elle retourne 1 en cas de succès(donc si son argument est premier).
    Or dans ta fonction tu fais:
    if (a == 0)
    {
    printf("%d ",j);
    }
    ainsi tu afficheses tous les nombres non-premiers!

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut
    Merci , ca marche enfin , merci a tous de votre aide , a charge de revanche

    Juste une petite question , si je voulais inclure un affichage page par page , il faut que je mette un compteur dans ma deuxieme fonction , et si il est egale a 25 , par exemple , je fais un getchar , c'est bien ca ?

  12. #12
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    pense à la balise

    (sinon, on lit tout le thread avant de s'en apercevoir )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une fonction implémentée en Java pour afficher les nombres premiers
    Par autran dans le forum Codes sources à télécharger
    Réponses: 2
    Dernier message: 01/05/2015, 16h45
  2. Réponses: 6
    Dernier message: 30/03/2015, 15h20
  3. Réponses: 2
    Dernier message: 23/05/2011, 21h47
  4. Problème fonction nombre premier
    Par alex2746 dans le forum Débuter
    Réponses: 13
    Dernier message: 29/09/2009, 21h48
  5. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo