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 :

Les nombres super-premiers


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Par défaut Les nombres super-premiers
    Un nombre est dit super premier s'il est premier et quand on supprime n'importe quel chiffre il reste premier. Exemple 113.
    Voici un code source d'un programme qui permet d'afficher tous les super-premiers de 1 à n donné. J'attends vos avis :

    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
    program premier;
    uses crt;
    var n,i:longint;
     function prm(n:longint):boolean;
    var i:longint;
    begin
    if n=1 then prm:=false else
       begin
       i:=2;
       while (n mod i <> 0) and (i<n) do i:=i+1;
       if i=n then prm:=true else prm:=false;
       end;
    end;
     
    function supprm(n:longint):boolean;
    var ch,aux:string;
          m:longint;
          s,i:byte;
          e:integer;
    begin
    str(n,ch);
    aux:=ch;
    if prm(n)=false then supprm:=false else
       begin
       s:=0;
       for i:=1 to length(aux) do
          begin
          delete(ch,i,1);
          val(ch,m,e);
          ch:=aux;
          if prm(m)=true then s:=s+1;
          end;
       if s=length(aux) then supprm:=true else supprm:=false;
       end;
    end;
     
    begin
    readln(n);
    for i:=1 to n do
       begin
       if supprm(i)=true then writeln(i);
       end;
    end.

  2. #2
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 176
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Le programme me paraît correct. J'ai juste une petite remarque, à propos de if prm(m)=true, qui pourrait s'écrire if prm(m). De même, if prm(n)=false pourrait s'écrire if not prm(n). En effet, le type boolean est fait pour représenter une proposition vraie ou fausse.

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Lae,

    Sans avoir testé, ça paraît correct.

    Toutefois, la fonction prm est largement optimisable.

  4. #4
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    Dans le prolongement des remarques précédentes on peut aussi remplacer (ligne 11):
    if i=n then prm:=true else prm:=false;
    par
    prm := (i=n);

    et encore les parenthèses ne sont utile ici que pour une meilleure lisibilité.

  5. #5
    Membre averti

    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Par défaut
    Merci beaucoup pour tous vos remarques. Ca fait vraiment plaisir

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 496
    Par défaut
    Salut

    Pour la recherche du nombre premier tu peux déjà limiter la recherche à la valeur entière de la racine carrée du nombre recherché.

    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
     
      Function NombreFacteur(N:Integer):Integer;
      Var
        Count,I,Racine:Integer;
      Begin
        Count:=2;
        Racine:=Trunc(Sqrt(N));
        For I := 2 to Racine do
        Begin
          If N mod I = 0 Then
            Inc(Count);
        End;
        Result:=Count;
      End;
     
      Function Premier(N:Integer):Boolean;
      Begin
        Premier:=NombreFacteur(N) = 2;
      End;
    Un autre un peu plus fin :


    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
     
    function prim ( n : integer ) : boolean ;
    var
       i , lim : integer ;
       TestInt : boolean ;
    begin
       if n<2 then
          TestInt:=false
       else 
       if n=2 then
          TestInt:=true
       else 
       if n mod 2 = 0 then
              TestInt:=false
       else
       begin
          i := 3;
          TestInt:=true ;
           lim:= trunc ( sqrt ( n ) ) ;
          while ( i<=lim ) and TestInt do
            if n mod i = 0 then 
              TestInt:=false
            else 
               i:=i+2
       end ;
       Result:=TestInt
    end ;

Discussions similaires

  1. [MIPS] Les nombres premiers
    Par dilyar1984 dans le forum Autres architectures
    Réponses: 0
    Dernier message: 20/05/2009, 17h50
  2. les nombres premiers
    Par chouuc dans le forum Mathématiques
    Réponses: 36
    Dernier message: 17/01/2009, 14h14
  3. Programme détectant les nombres premiers
    Par frankthechamp dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/12/2008, 23h41
  4. script qui donne les nombres premiers
    Par islah dans le forum Langage
    Réponses: 2
    Dernier message: 28/08/2008, 22h06
  5. Réponses: 24
    Dernier message: 27/09/2005, 22h16

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