Nombre Composé

Fermé
Gradi Messages postés 16 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 27 décembre 2012 - 22 déc. 2012 à 18:37
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 - 24 déc. 2012 à 09:45
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

Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
22 déc. 2012 à 19:28
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
3
Gradi Messages postés 16 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 27 décembre 2012 2
22 déc. 2012 à 20:55
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
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
22 déc. 2012 à 21:14
Ce sont tes mots, mais l'énoncé exact .. c'est quoi .. sortir les nombres premier de 1 à (nombre que l'utilisateur à encoder) ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
22 déc. 2012 à 21:19
"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,...
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
22 déc. 2012 à 21:39
Bonsoir KX,

Tu sait décoder toi .. perso, j'ai du mal ! .. Merci
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
22 déc. 2012 à 21:48
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.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
22 déc. 2012 à 22:01
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.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
22 déc. 2012 à 21:47
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
22 déc. 2012 à 21:54
Ç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.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
22 déc. 2012 à 22:03
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
22 déc. 2012 à 22:12
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);
}
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
22 déc. 2012 à 22:18
Crotte, je ne sait pas t'envoyer de message perso.
t'es sûr System.out.println(2); ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
22 déc. 2012 à 22:23
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++)
0
Gradi Messages postés 16 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 27 décembre 2012 2
Modifié par Gradi le 23/12/2012 à 15:57
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 23/12/2012 à 16:20
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
0
Gradi Messages postés 16 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 27 décembre 2012 2
23 déc. 2012 à 18:33
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?
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
23 déc. 2012 à 19:04
- 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.
0
Gradi Messages postés 16 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 27 décembre 2012 2
Modifié par Gradi le 23/12/2012 à 19:55
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
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
24 déc. 2012 à 09:19
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 déc. 2012 à 09:36
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.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
24 déc. 2012 à 09:45
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.
0