Nombre Composé

Bonjour,

j'ai un problème pour continuer l'Algorithme qui décompose un nombre en facteur premier. J'aimerais avoir votre aide SVP, merci d'avance pour votre bienveillance.

voila l'algorithme:

programme nombre_composé
variables nbr, cont,
début
lire (nbr)
pour cont ? 1 à nbr
si (nbr modulo cont) = 0 Alors
..............

finsi
finpour

8 réponses

  1. Bonsoir Gradi,

    Sans énoncé correct .. difficile de donner un coup de main.
    En plus, il faut prendre l'habitude
    - d'écrire les mots-clés en majuscule: SI, FIN SI, TANT QUE, etc
    - Indenter le programme, même l'algo
    - Penser à utiliser la balise "Code" .. elle est faite pour ca
    1. L'énoncer d'écrire un algorithme qui demande à l'utilisateur d'entrer un nombre entier et l'algorithme lui fournira la décomposition du nombre eb facteur premier
      1. Ce sont tes mots, mais l'énoncé exact .. c'est quoi .. sortir les nombres premier de 1 à (nombre que l'utilisateur à encoder) ?
      2. Modérateur
        "sortir les nombres premier de 1 à"
        Une décomposition en facteur premier c'est trouver tous les entiers premiers qui divisent le nombre. Il ne s'agit donc pas d'énumérer tous les nombres premiers.

        Exemples : 12=2*2*3, 17=17, 30 = 2*3*5,...
      3. Bonsoir KX,

        Tu sait décoder toi .. perso, j'ai du mal ! .. Merci
      4. Modérateur
        Pour moi un "algorithme qui décompose un nombre en facteur premier" c'est très explicite, c'est de l'algèbre niveau terminale (je ne sais pas si tu en es là)

        Il faut trouver la série de nombres premiers dont le produit donne l'entier cherché.

        Si je reprends mes exemples :

        12 se décompose en [2,2,3] car 12=2*2*3 avec 2 et 3 qui sont premiers.
        17 se décompose en [17] car 17=17 avec 17 qui est premier.
        30 se décompose en [2,3,5] car 30=2*3*5 avec 2,3 et 5 qui sont premiers.

        Quelques propriétés :
        La décomposition en nombre premier est unique (à l'ordre près)
        Un même nombre premier peut être utilisé plusieurs fois dans une même décomposition.
      5. Je pense que j'ai plus de mal avec le français "ui fournira la décomposition du nombre eb facteur premier" qu'avec l'algorithme.
    2. Gradi,

      Dans ton alogo, il faut déclarer le variables, les initialiser (évidemment), puis,

      il faut:
      soit stocker les nombres premier .. à éviter car toute une ribambelle,
      soit faire tourner une boucle incrémentale et vérifier à chaque nombre s'il peut diviser le nombre X (ce nombre étant celui entré par l'utilisateur)

      Résultat possible = 2
      1) X n'est divisible que par un et par lui-même .. alors il est premier et tu l'affiche tel quel
      2) X est divisible par plusieurs autre nombres .. alors tu refais une boucle en "lisant" les nombres premiers de la première boucle et en commençant par le plus petit (sinon ce serait trop facile !).
      a chaque fois, il faut re-mémoriser le nouveau X, c'est-à-dire le X que tu vient de diviser par ce nombre premier et recommencer la boucle au début du tableau.
      1. Modérateur
        Ça semble un peu compliqué tout ça, en particulier la partie "recommencer la boucle au début du tableau."
        De quel tableau tu parles ? De plus il n'est pas nécessaire de recommencer au début.
        Si tu as déjà testé que X n'était pas divisible par P, alors X/Q ne sera pas non plus divisible par P.
      2. Je pensait au tableau de nombres premier entre 1 et nombre X.
        Mais on est pas obligé de mémoriser ce tableau .. on peut le faire à la volée.
      3. Modérateur
        En Java ça donnerait ça :

        // version O(n)
        public static void decomposer(int n)
        {		
        	for (int d=2; d<=n; d++)
        	{
        		while (n%d==0)
        		{
        			System.out.println(d);
        			n/=d;
        		}
        	}
        }

        //version O(sqrt(n)/2)
        public static void decomposer(int n)
        {	
        	while (n%2==0)
        	{
        		System.out.println(2);
        		n/=2;
        	}
        	
        	for (int d=3, max=(int) Math.sqrt(n); d<=max; d+=2)
        	{
        		while (n%d==0)
        		{
        			System.out.println(d);
        			n/=d;
        			max=(int) Math.sqrt(n);
        		}
        	}
        	
        	if (n!=1)
        		System.out.println(n);
        }
      4. Crotte, je ne sait pas t'envoyer de message perso.
        t'es sûr System.out.println(2); ?
      5. Modérateur
        Non, j'ai supprimé l'option MP, mais au besoin j'ai laissé la discussion que j'ai créé l'autre jour et que tu peux continuer (même si ça n'a rien à voir)

        Le System.out.println(2); est correct, puisque c'est uniquement sur la boucle while (n%2==0) où je traite tous les nombres pairs (ce qui permet de faire d+=2 dans le for, au lieu de d++)
    3. Regarder d'abord ce que j'ai pu trouver:

      PROGRAMME Nombre_Composé
      VAR k, nbre : ENTIER
      VAR dec : CHAINE DE CARACTERES
      DEBUT
      POUR i allant de 2 à nbre
      test = (nbre modulo k)
      SI test = 0 ALORS
      dec = test & " * "
      FINSI
      FINPOUR
      dec = DELETE ( dec, LONG(dec), *) ( pour supprimer le * terminal )
      AFFICHER " Le nombre décomposé en facteur premier est alors:", dec
      FIN

      Ai-je raison de faire comme ça?
      1. Bonsoir Gradi,
        SI test = 0 ALORS   
         dec = test & " * "   
        FINSI 

        Dans ce code test vaut 0 .. donc la phrase finale va être du genre:
        "Le nombre décomposé en facteur premier est alors: 0 * 0 * 0 * 0 * 0"

        En plus pour comparer deux variables c'est "==" et pas "="

        Edit: en gras pour visu
        1. Voyez un peu l'Algorithme corrigé

          PROGRAMME Nombre_Composé
          VAR k, nbre : ENTIER
          VAR dec : CHAINE DE CARACTERES
          DEBUT
          POUR i allant de 2 à nbre
          test = (nbre modulo k)
          SI test == 0 ALORS
          dec = k & " * "
          FINSI
          FINPOUR
          dec = DELETE ( dec, LONG(dec), *) ( pour supprimer le * terminal )
          AFFICHER " Le nombre décomposé en facteur premier est alors:", dec
          FIN

          Est-ce maintenant correct?
          1. - Les variables "k" et "dec" doivent être initialisée, sinon, on pourrait avoir des surprises de mauvais goût !

            - Avec ce code "dec = k & " * " ", "dec est à chaque fois réinitialisé .. il faut faire "dec = dec + k & " * " " pour ajouter en fin de chaîne

            - Je pense que tu n'as pas saisi le fonctionnement du problème. Regarde ce qu'à écrit KX ici : https://forums.commentcamarche.net/forum/affich-26723985-nombre-compose#7
            Cela te permettra de comprendre comment procéder.
        2. Pour le problème de k, je devais plutôt écrire i, le k est apparu bizarrement, c'est le lapsus scriptae; pour le dec, j'ai suivi ton conseil Vois maintenant ce qui suit:

          PROGRAMME Nombre_Composé
          VAR k, nbre : ENTIER
          VAR dec : CHAINE DE CARACTERES
          DEBUT
          dec = ""
          POUR i allant de 2 à nbre
          test = (nbre modulo i)
          SI test == 0 ALORS
          dec = dec + i & " * "
          FINSI
          FINPOUR
          dec = DELETE ( dec, LONG(dec), *) ( pour supprimer le * terminal )
          AFFICHER " Le nombre décomposé en facteur premier est alors:", dec
          FIN
          1. Bonjour Gradi,

            Tu peux remplacer
            test = (nbre modulo i)
            SI test == 0 ALORS
            par
            If (nbre MODULO i == 0) Then
            On est pas obligé de le mémoriser!

            Quand tu passe dans la condition "SI" il faut décrémenter i de 1, car il faut recommencer avec le même diviseur .. ce n'est pas parce qu'un nombre (600) est divisible par 2 une fois, qu'il n'est plus divisible par 2 .. une deuxième fois .. une troisième fois, etc.

            Ceci "dec = DELETE ( dec, LONG(dec), *) ( pour supprimer le * terminal ) " n'est pas propre !
            Il faut ajouter une variable booléenne 'DeJaPasse' et l'initialiser à 'FAUX' .. dans la condition si, tu la modifie en 'VRAI' après avoir modifié la variable 'dec'.
            Et dans la condition 'SI', tu affiche comme ceci:
            SI(DeJaPasse)ALORS
            	dec = dec + " * " + i
            SINON
            	dec = dec + i
            FIN SI
            De cette façon, il ne faut plus "chipoter" à la variable
            1. Modérateur
              Je ne comprends pas trop les algorithmes écrits comme ça, mais il me semble qu'il y a un autre problème, c'est que nbre ne change jamais.

              Or puisque l'on compte plusieurs fois le même diviseur, il ne faudrait pas voir à faire une boucle infinie en faisant toujours le même test :

              2 divise 600, donc on recommence avec 2
              2 divise 600, donc on recommence avec 2
              2 divise 600, donc on recommence avec 2
              2 divise 600, donc on recommence avec 2
              etc.

              En réalité il faudrait faire :

              2 divise 600, donc on recommence avec 2 et 300
              2 divise 300, donc on recommence avec 2 et 150
              2 divise 150, donc on recommence avec 2 et 75
              2 ne divise pas 75, donc on recommence avec 3 et 75
              etc.
            2. Bonjour KX, Gradi,

              Je suis heureux de voir que l'on peut toujours compter sur ta vigilance.

              Il y a tellement à faire que je n'ai pas vu cette variable 'nbre' qui ne varie pas.
              Effectivement, KX a raison .. quand tu as défini que nbre modulo 2 = 0 il faut alors diviser n par ce nombre ! c'est impératif !

              Merci KX.