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

Algorithmes et structures de données Discussion :

Décomposition en facteurs premiers


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut Décomposition en facteurs premiers
    Bonjour

    j'amerais savoir comment faire une décomposition en facteurs premiers d'un nombre, sans fonction recursive ou avec la plus petite recursivité possible.
    en effet, j'ai fait une fonction de ce type (en vb6) mais il me met "erreur , memoire pile insufisante" ce qui est plutot explicit (option ).

    j'amerais que le résultat me sois renvoyé sous forme de liste si possible (enfin si c'est en string séparable, c'est pas grave).

    j'attend vos réponses avec impatience

    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  2. #2
    Membre confirmé Avatar de ekameleon
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 401
    Points : 483
    Points
    483
    Par défaut
    Hello
    Voilà un algo en ECMAScript(AS2) :
    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
     
    /* ---- primeFactor(n)
    Defines prime factors of 'n', positive but restricted integer value, ignores decimals.
    returns a string representation of the multiplication of primes of 'n'.
    */
     
    function primeFactor(n:Number):String {
            var bFlag:Boolean;
            n |= 0;
            if (n==1) return "1";
            var temp:Number = n;
            var delim:String = "*";
            var sFactor:String = "";
            while (1) {
                if (temp%2==0) {
                    temp /= 2;
                    sFactor += 2+delim;
                }
                else break;
            }
            var num:Number = 3;
            while (1<temp) {
                bFlag = true;
                while (bFlag) {
                    if (temp%num==0) {
                        temp /= num;
                        sFactor += num+delim;
                    }
                    else bFlag = false;
                }
                num += 2;
            }
            return sFactor.substr(0,-1);
        }
     
     
    var s:String = primeFactor(400) ;
    trace (s) ;
    Cela marche bien il me semble
    EKA+

  3. #3
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    quelques petites questions, je suis pas un adepte du c (j'ai vaguement fait du maple):
    que veut dire:
    • n |= 0 (je ne sait pa ce que veut dire |)
      temp%2==0 (idem pour le %2)
      temp /= 2 (avec le /)
      break (pause je suppose mais come je suis pas sûr)
      trace (s)


    et tan qu'on y est, tu pourrais m'expliquer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    String { 
            var bFlag:Boolean; 
            n |= 0; 
            if (n==1) return "1"; 
            var temp:Number = n; 
            var delim:String = "*"; 
            var sFactor:String = ""; 
            while (1) { 
                if (temp%2==0) { 
                    temp /= 2; 
                    sFactor += 2+delim; 
                } 
                else break; 
            }
    qu'est-ce que string si elle contient de variables?
    un type?

    merci beaucoup
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Points : 125
    Points
    125
    Par défaut
    on applique un OU sur les bits de n et on place le résultat dans n.

    on cherche le reste de la division de temp par 2, la condition permet donc de savoir si temp est divisible par 2.

    on divise temp par 2 et on met le résultat dans temp
    break (on sort de la boucle while (1) {...}).

    A mon avis ça n'a rien à voir avec l'algorithme, c'est juste pour afficher le résultat (une chaîne contenant tous les facteurs premiers délimités par des étoiles).

    String est le type de retour de la fonction.

  5. #5
    Membre confirmé Avatar de ekameleon
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 401
    Points : 483
    Points
    483
    Par défaut
    c'est pas du C .. c'est de l'actionscript .. basé sur l'ECMAScript 262 (comme le javascript par exemple)
    http://www.ecma-international.org/publications/standards/Ecma-262.htm

    L'actionscript c'est le language de Flash entre autre...

    Donc :

    1 - l'opérateur | (bitwise OR)
    Convertit expression1 et expression2 en entiers 32 bits non signés et renvoie un 1 pour chaque position de bit où les bits correspondants de expression1 ou expression2 ont la valeur 1.

    2 - % c'est le modulo
    Calcule le reste de expression1 divisé par expression2.

    3 - /=
    Affecte à expression1 la valeur de expression1 / expression2.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var a = 2 ;
    a = a / 2 ; // diviser
    On simplifie cette notation en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var a = 2 ; 
    a /= 2 ;
    4 - break

    Apparaît au sein d'une boucle (for , for..in, do..while ou while) ou dans un bloc d'instructions associées à un cas donné au sein d'une instruction switch. Lorsqu'elle est utilisée dans une boucle, l'instruction break force Flash à ignorer le reste du corps de la boucle, arrête l'action de la boucle et exécute l'instruction suivant l'instruction de bouclage. Lors de l'utilisation dans le cadre d'une instruction switch, l'instruction break force Flash à ignorer le reste des instructions de ce bloc case et passe à la première instruction suivant l'instruction switch qui l'encadre.

    Dans les boucles incorporées, l'instruction break ignore uniquement le reste de la boucle immédiate, sans sortir de la série de boucles incorporées. Pour sortir d'une série de boucles incorporées, voir try..catch..finally.

    5 - String
    c'est le type des chaines de caractères....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var str = "coucou" ;
    En actionscript depuis FlashMX2004 on peut faire du typage fort au niveau des variables en les déclarant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var maVariable :Type = valeur ;
    Donc si je mets un :Number... c'est que la variable est un nombre par exemple.

    Pour le reste .. l'algo est pas compliqué... il est basé sur le taf de Richard Wright (cherche un peu sur google tu auras des infos sur son algo)

    EKA+

  6. #6
    Membre confirmé Avatar de ekameleon
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 401
    Points : 483
    Points
    483
    Par défaut
    Oui le trace() c'est la fonction dans flash pour faire une sortie du résultat... comme un print, un echo ou autre
    EKA +

  7. #7
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    merci, c'étais le string surtous que je ne comprenais pas non pas que je ne conaisse pas les chaines de caractères mais à cause de ce qui suivait.


    merci encore

    salut
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  8. #8
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    petit code en delphi
    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
     
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    var i,j,k,n : integer;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    val(Edit1.text,i,j);
    if ( j=0) and ( i > 1) then
       begin
       ListBox1.Clear;
       k:=i;
       j:=2;
       while k > 1 do
          begin
          n:=0;
          while ( k mod j) = 0 do begin inc(n); k:= k div j end;
          if n > 0 then
             Listbox1.Items.add(IntToStr(j) + '  ^ ' + inttostr(n));
          inc(j);
          end;
       end;
    end;
     
    end.

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

Discussions similaires

  1. Décomposition en facteurs premiers
    Par Invité dans le forum Mathématiques
    Réponses: 7
    Dernier message: 23/04/2012, 23h39
  2. Réponses: 1
    Dernier message: 08/04/2009, 12h17
  3. Décomposition en facteurs communs
    Par Skeeter dans le forum Fortran
    Réponses: 4
    Dernier message: 24/11/2008, 10h41
  4. Décomposition en facteurs premiers
    Par Girl24 dans le forum Fortran
    Réponses: 6
    Dernier message: 18/11/2008, 13h08
  5. Décomposition en nombres premiers
    Par WhiteTigerZ dans le forum Pascal
    Réponses: 20
    Dernier message: 13/01/2007, 19h07

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