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 :

Nombre Harshad dont le prédécesseur est premier


Sujet :

Pascal

  1. #1
    Nouveau membre du Club

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

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 34
    Points
    34
    Par défaut Nombre Harshad dont le prédécesseur est premier
    Bonjour à tous,
    J'ai écrit un programme qui permet d'afficher les nombres Harshad entre 100 et 150 dont le prédécesseur est un nombre premier (un nombre Harshad est un entier divisible par la somme de ses chiffres).
    Mais malheureusement j'ai pas obtenu le résultat voulu.
    Voici le 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
    program premier;
    uses crt;
    var n,m,i:integer;
     
    function testp(n:integer):boolean;
    var i:integer;
    begin
    if n=1 then testp:=false else
    begin 
    i:=2;
    while (i<=n) and (n mod i <> 0) do i:=i+1;
    if i=n then testp:=true else testp:=false
    end;
    end;
     
    function testh(n:integer):boolean;
    var ch:string; k,i,s,e:integer;
    begin
    str(n,ch);
    s:=0;
    for i:=1 to length(ch) do
    begin
    val(ch[i],k,e);
    s:=s+k
    end;
    if s=n then testh:=true else testh:=false
    end;
     
    begin
    for n:=100 to 150 do
    begin
    if ( testp(n-1)=true and testh(n)=true )
    then write(n:4);
    end;
    end.

  2. #2
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonsoir !

    J'ai un doute sur la façon dont le compilateur calcule cette expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testp(n-1)=true and testh(n)=true
    Obtiens-tu les mêmes résultats si tu écris ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testp(n-1) and testh(n)
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Nouveau membre du Club

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

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonsoir !

    J'ai un doute sur la façon dont le compilateur calcule cette expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testp(n-1)=true and testh(n)=true
    Obtiens-tu les mêmes résultats si tu écris ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testp(n-1) and testh(n)
    Je l'ai remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ( testp(n-1) and testh(n) )=true )
    Maintenant aucun resultat s'affiche ..

  4. #4
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Tu as dit qu'un "nombre Harshad" était un nombre divisible par la somme de ses chiffres mais ce n'est pas ce que tu vérifies dans ta fonction :

    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    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 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Salut


    J'adresse quelque critiques sur le travail fait mais je n'oublie pas que Mokhles est lycéen.

    Il est vrai qu'il y a des progrès à faire sur le style, comparer une expression booléenne à True ou False ne fait qu'alourdir le code.

    Je prend la fonction testn:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function testh(n:integer):boolean;
    var ch:string; k,i,s,e:integer;
    begin
    str(n,ch);
    s:=0;
    for i:=1 to length(ch) do
    begin
    val(ch[i],k,e);
    s:=s+k
    end;
    if s=n then testh:=true else testh:=false
    end;
    peut se réécrire plus concisément :
    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
     
    function testh(n:integer):boolean;
    var 
      ch:string; 
      k,i,s,e:integer;
    begin
      str(n,ch);
      s:=0;
      for i:=1 to length(ch) do
      begin
        val(ch[i],k,e);
        s:=s+k
      end;
      testh:= (s=n);
    end;
    Une variante plus rigolote (et sans doute plus efficace) évite de passer par une chaîne avec des opérations arithmétiques simples:

    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
     
    function SommeDesChiffres(n:Integer): Integer;
    { décommente la déclaration ci-dessous et l'affectation en fin de fonction si tu codes en TurboPascal }
    { var Result : Integer; }
    begin
      Result := 0;
      repeat
        Inc(Result, n mod 10);
        n := n div 10;
      until n = 0;
      { SommeDesChiffres := Result; }  
    End;
     
    function testh(n:integer):boolean;
    begin
      testh := (SommeDesChiffres(n)=n);
    end;
    En outre, si tu veux obtenir la somme des chiffres dans une base de numération quelconque, il suffit d'adapter la fonction SommeDesChiffres en ajoutant un paramètre Base: Integer; qui remplace 10 dans le corps de la fonction. Rappelle si tu veux plus d'explication à ce sujet.

    Du point de vue de l'efficacité, il serait préférable de calculer tous les nombres premiers jusqu'à 150 une fois pour toute, l'algorithme du crible d'Eratosthène convient parfaitement pour cela. L'algorithme est un peu plus compliqué mais pas inaccessible.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour Éric ! Oui à toutes les améliorations que tu proposes, sauf que tu as reproduit l'erreur du programme original, relativement à la définition du "nombre Harshad" (voir mon précédent message).
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    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 559
    Points : 3 946
    Points
    3 946
    Par défaut
    C'est vrai que je n'ai pas corrigé, je me suis focalisé sur l'amélioration que j'ai proposé. Pour la correction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function testh(n:integer):boolean;
    begin
      testh := ((n mod SommeDesChiffres(n)) = 0);
    end;
    devrait faire l'affaire.

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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