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

Pascal Discussion :

Déterminer si un nombre est premier


Sujet :

Pascal

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Déterminer si un nombre est premier
    Bonjour à tous,

    Je rencontre un problème avec mon programme, est-ce quelqu'un pourrait m'éclairer?
    Le programme reçoit un nombre entier et renvoie si c'est un nombre premier ou pas:
    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
     
    program test;
    var
    a, diviseur :integer;
    result	:BOOLEAN;
     
    begin
    writeln('Entrez un nombre entier');
    readln(a);
     
    IF (a = 2) THEN
    Result := True
     
        ELSE IF (a > 2) THEN
        result := false
     
        ELSE IF (a mod 2 = 0) THEN
        Result := False
     
        For diviseur := 2 to (a-1) DO
        ELSE IF (a mod diviseur = 0) THEN
        result := false
     
     
    ELSE
    result := true;
     
    writeln('Est-ce que ce nombre est premier? ', result)
    end.
    Je suppose que le problème vient d'à partir de la ligne 20 ...

    Merci d'avance!

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Ton indentation n'est pas du tout claire, de même que l'imbrication des condition If/Then/Else. Essaye de bien découper ces instructions, et ton problème devrait apparaître plus clairement.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    De cette manière, j'arrive à faire fonctionner mon programme mais l'écriture ne me plaît pas... Je n'arrive vraiment pas à faire fonctionner le premier... Est-ce quelqu'un pourrais me montrer la bonne écriture ? Ce n'est pas faute d'avoir y essayé...

    Merci pour la réponse d'au dessus mais je n'y vois pas plus clair... Je re essayerai demain à tête reposée.
    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
     
    program test;
     
    var
    a, diviseur :integer;
    result	:BOOLEAN;
    begin
    writeln('Entrez un nombre entier');
    readln(a);
    result := true;
    IF a = 2 THEN
    result := true;
    IF a < 2 THEN
    result := false;
    for diviseur := 2 to (a-1) DO
    IF (a mod diviseur = 0) then
    result := false;
     
    writeln('Est-ce que ce nombre est premier? ', result)
    end.

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 507
    Points
    15 507
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Weldan Voir le message
    Est-ce quelqu'un pourrais me montrer la bonne écriture ?
    Pour tenir compte du conseil qui t'a été donné plus haut, tu ferais peut-être bien d'utiliser systématiquement l'écriture suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if condition then
      begin
        {...}
      end
    else
      begin
        {...}
      end;
    Ainsi tu te rendrais mieux compte de ce qui ne va pas dans ton code.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Koa,

    +1, ET d'utiliser une mise en forme cohérente et régulière.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour vos réponses qui m'aide. J'ai enfin réussi à faire fonctionner la bête ! ;-)
    Est-ce que vous pourriez m'éclairer sur 2-3 points:
    Il y a-t-il un moyen d'éviter que mon programme calcul tous les diviseurs jusqu'au (nombre-1) une fois qu'il a trouvé un nombre qu'il le divise.
    Peut-être que je ne suis pas clair, je vais vous donner un exemple:
    Imaginons que je rentre le chiffre 9: mon programme va le diviser par 2 puis 3, puis 4... jusqu'à 9 diviser par 8. Est-ce qu'il y a moyen qu'une fois que mon programme remarque que 9 est divisible par 3 il arrête la boucle ? ça me permettrait d'économiser... Devrais-je utiliser la boucle repeat... until ?

    Deuxième question:
    Est-ce si par exemple mon programme rempli la première condition, il y-a-t-il moyen qu'il évite toutes les autres conditions ? Ou est-ce que ça le fait déjà lorsqu'on utilise IF, ELSE IF, Else ... ?

    Merci à vous et désolé si mes questions semblent stupides ...

  7. #7
    Membre habitué Avatar de Modulpro
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2010
    Messages : 76
    Points : 175
    Points
    175
    Par défaut
    Bonjour,

    Il existe un théorème en arithmétique qui stipule que si un nombre n'est divisible par aucun entier inférieur à sa racine carré, alors ce nombre est premier. Tu n'as donc pas besoin de monter jusqu'à n-1 mais seulement jusqu’à l'entier immédiatement inférieur à la racine de n.

    Pour ce qui est de stopper le test quand un diviseur est trouvé, tu peux remplacer ta boucle for par une boucle while qui teste deux conditions, quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (diviseur <= sqrt(a)) and (result = false) do
      begin
        ...
        diviseur:=diviseur+1;
      end;
    Edit : Pour ta deuxieme question, la structure if , else if, ..., else if, else permet effectivement d'ignorer toutes les conditions suivantes dès qu'il y en a une de vraie. Ainsi si la première condition est vraie, tout le reste de la structure est ignorée.

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Hoi,

    Et n'oublies pas de ne pas utiliser les diviseurs pairs comme tu le fais avec ta boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for diviseur := 2 to (a-1) DO

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Points : 26
    Points
    26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (diviseur <= a div 2) and (result = false) do
      begin
        ...
        diviseur:=diviseur+1;
      end;

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Tiens cette réponse :
    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
    program premier;
    var n,c,i:integer;
    begin
    repeat
          begin
               Writeln('donner un entier naturel');
               readln(n);
               if n=1 then writeln('1 n''est pas un premier')
               else
                   begin
                        i:=1;
                        repeat
                              begin
                                   i:=i+1;
                                   c:=n mod i;
                              end
                        until c=0;
                        if i=n then writeln(n,' est un premier ')
                        else writeln(n,' n''est pas un premier');
                   end;
          end
    until false;
    end.

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Woe,

    Quand on donne une réponse, on essaye d'en fournir une qui améliore ce qui a déjà été fait, ce qui n'est pas du tout le cas de la tienne.

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Vous n'arrivez pas a comprendre que le changement est la meilleure façons d'améliorer les choses???

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Hoa,
    Citation Envoyé par ragone Voir le message
    Vous n'arrivez pas a comprendre que le changement est la meilleure façons d'améliorer les choses???
    Le changement est une bonne chose, quand il va dans le bon sens. Mais pour le côté amélioration, ce n'est pas le cas de ton code, qui reprend tout ce qu'il ne faut pas faire pour résoudre le problème posé.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 7
    Points
    7
    Par défaut
    Bonjour
    lien de telechargement d'un programme en pascal qui détermine si un nombre est premier ou pas http://www.4shared.com/zip/YZ9ohCgj/...e_premier.html

  15. #15
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    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
    21
    22
    function EstPremier(const a: Integer): Boolean;
    var
      nmax, i: Integer;
    begin
      if (a = 2) then
        Result := True
      else if (a = 1) or (a mod 2 = 0) then
        Result := False
      else
      begin
        nmax := Trunc(Sqrt(a))+1;
        i := 3;
        Result := True
        while (i < nmax) do
        begin
            Result := (a mod i <> 0)
            if not Result then
               exit
            Inc(i, 2); // que les nombres impairs
        end
      end;
    End;
    est une solution parmi d'autres, j'ai testé l'algo en Python, j'ai pas FPC sur place.

    Il est peut-être possible d'éviter les divisions en adaptant une mise en oeuvre simple du crible d'Eratosthène (Il y a eu des discussions ici il y a peu sur le sujet), je n'ai pas vérifié cette solution.

    @+

Discussions similaires

  1. comment tester si un nombre est premier en php ?
    Par Shyboy dans le forum Langage
    Réponses: 1
    Dernier message: 09/03/2007, 17h08
  2. Réponses: 9
    Dernier message: 30/01/2007, 21h03
  3. Savoir si un nombre est premier
    Par Jihnn dans le forum Vos contributions VB6
    Réponses: 4
    Dernier message: 11/08/2006, 10h14
  4. Comment savoir si un nombre est premier ?
    Par Extra-Nitro dans le forum Général Python
    Réponses: 9
    Dernier message: 03/01/2006, 14h28
  5. Déterminer si un nombre est premier
    Par Fandefruit dans le forum Langage
    Réponses: 7
    Dernier message: 30/12/2005, 10h52

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