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 :

Calcul de la factorielle d'un nombre naturel


Sujet :

Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Calcul de la factorielle d'un nombre naturel
    Bonjour, je suis étudiant en première année de licence informatique, et j'ai un problème afin de résoudre un exercice. Voici mon problème ..

    Le but est d'établir la preuve d'un programme pascal, un algorithme de calcul de la factorielle d'un naturel.

    l'assertion P est :

    k <= n
    n et la valeur de k sont de meme parité
    q = (k-1)k
    f = k!

    la condition C est :

    k < n

    Et I l'instruction :

    begin
    q := q + 4*k +2
    f := f*q
    k := k+2
    end

    La question est : Quelles valeurs donner aux variables k,q et f avant l'execution de la boucle pour qu'à la terminaison de celle-ci la valeur de la variable f soit n!

    J'ai essayé de partir de l'état final ( f = n!, d'ou k =n .. ), mais je n'arrive pas à avancer ..

    Merci d'avance de votre aide.

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour,

    Il va fallir exposer un peu mieux ton problème, parce que tel quel, il est incompréhensible.
    Quelle est la boucle ? Où est le programme ? Il n'y a pas d'entrée, pas de sortie...

    Bref, là, on ne peut rien pour toi.

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci quand même d'avoir pris la peine de répondre, mais j'ai fini par comprendre. . Si on prend k = n mod 2, f = 1, et q = 0, ca marche. Voici un exemple si certaines personnes en trouveront l'utilité un jour :

    Exemple pour n = 0:0! = 1

    k = n mod 2 = 0;
    f = 1;
    q = 0;
    la condition k < n est fausse, donc la boucle n'est pas executée.
    résultat: f = 1 = 1!

    exemple pour n = 3:3! = 6

    k = n mod 2 = 1;
    f = 1;
    q = 0;
    la condition k < n est vraie, donc boucle est executée:
    q := q + 4*k +2 = 6;
    f := f * q = 6;
    k := k+2 = 3;

    la condition k < n est fausse, donc boucle s'arrête.
    résultat: f = 6 = 3!

    Et ainsi de suite...

  4. #4
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    euh il y a beaucoup plus simple pour faire un calcul de factorielle
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Oui il y a plus simple, mais cet algorithme diminue sensiblement le nombre de multiplications entre entiers en comparaison de l'algorithme usuel .. Qui était le principe de l'exercice.

  6. #6
    Membre confirmé
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Points : 589
    Points
    589
    Par défaut bonjour,
    il y'a beacoup plus simple franchement le calcule d'un factoriel se fait en une seule ligne de code enfin presque..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    n!:=n(n-1)*(n-2)****1;
    pourqoi faire une boucle se compliquer la vie
    ecrire l'algorithme d'un programme se resume aussi a gagner du temp
    pour ta solution elle est juste j'ai pas bien compri le but de l'exercise
    ps:j'ai rien compri a ton programme parfoi tu met des affectation parfoi des egalité
    @++
    et vint le 20siècle et l'homme se mit à réflechir comme la machine auteur: diden138
    Langage: Pascal,OCaml,Delphi,c/c++.
    Langages web:Xhtml,Css,Php/Mysql,Javascript,Actionscript 2.0
    Plate forme:Windows XP Pro SP2./Red Hat 9.0/SUSE 10.2
    Config :Intel P4 3.2GHZ,2MO cach,512 RAM.
    Outils:Tp7,objective caml,Delphi 6 perso, C++builder 6,Visual C++ Express edition sous win,code-block sous linux(Ubuntu) .

  7. #7
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    n!:=n(n-1)*(n-2)****1;
    déja tu n'implémentes pas ca comme ca ^^ ensuite il a répondu en donnant le but de son exercice...Il avait un énoncé précis au départ

    ps: la forme "usuelle"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    n := X;
    fact := 1;
     
    while(n>=1) do
    begin
         fact := fact*n
         n := n -1;
    end;

    ps:j'ai rien compri a ton programme parfoi tu met des affectation parfoi des egalité
    les égalités sont des exemples de résultat....
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

  8. #8
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Ah bon, moi je l'implémente comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (define (fact n)
        (define (fact-rec n t)
            (if (= n 0)
                t
                (fact-rec (- n 1) (* n t))))
        (fact-rec n 1))
    Comme quoi, on peut faire ça de plein de manières différentes.

    Sinon, je vaius écrire en Pascal l'algorithme proposé par Sadgunner, histoire qu'il puisse reservir
    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 Fact(const n: Integer): Integer;
    var
      k, q, f: Integer;
    begin
      f := 1;
      q := 0;
      k := n mod 2;
     
      while k < n do
      begin
        q := q + 4*k + 2;
        f := f * q;
        k := k + 2;
      end;
     
      Fact := f;
    end;
    Ce serait sympa de nous donner la preuve mathématique de l'algo, elle n'est pas directe (et j'ai pas envie de la faire ).

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  9. #9
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Ah bon, moi je l'implémente comme ça :
    Code :

    (define (fact n) (define (fact-rec n t) (if (= n 0) t (fact-rec (- n 1) (* n t)))) (fact-rec n 1))
    ah oui je n'avais pas vu ca comme ca

    si j'ai le temps demain je ferai la preuve de l'algo
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

  10. #10
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 39
    Points : 37
    Points
    37
    Par défaut Le preuve
    On prouve par induction que à chaque pas k :
    q = (k+1)*(k+2) (#)

    k varie par pas de 2 et et chaque étape on multiplie f par q, donc à chaque pas k f contient (k+2)!
    Avant la boucle on établit clairement la parité de n et on choisi correctement le k de départ (0 ou 1).

    Calcul pour (#) : supposons (#) vrai pour k,
    à l'étape d'après, en début de la boucle while
    q := q+ 4(k+2) + 2 = (K+1)*(k+2) + 4k + 8 + 2 = k^2+ 7k + 12 = (K+3)*(k+4)
    (k étant l'ancienne valeur !)

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

Discussions similaires

  1. Calculer le factorielle d'un nombre (Dev-C++)
    Par Matadox dans le forum Débuter
    Réponses: 9
    Dernier message: 03/02/2014, 00h51
  2. Calculer la factorielle d'un nombre en C
    Par planete.game57 dans le forum Débuter
    Réponses: 26
    Dernier message: 19/10/2009, 23h12
  3. script samba qui calcule le factoriel d'un nombre entier
    Par miryam22 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/05/2008, 10h00
  4. Prog pour calculer la factorielle d'un nombre
    Par Lenezir dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 09h42
  5. factoriel d'un nombre
    Par etoile1506 dans le forum C
    Réponses: 10
    Dernier message: 03/12/2005, 15h46

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