begin process at 2012 05 28 13:19:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > DÉCOMPOSITION EN FACTEURS PREMIERS

DÉCOMPOSITION EN FACTEURS PREMIERS


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :décomposition, facteurs, premiers Niveau :Débutant Date de création :28/03/2010 Date de mise à jour :23/08/2010 14:51:12 Vu :3 425

Auteur : Minilogus

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Ce petit programme javascript permet de décomposer un grand nombre en produits de nombres premiers.

Une version directement utilisable à cette adresse:

http://minilog.freehostia.com/Decomposit ion_en_facteurs_premiers.php

Source

  • <html>
  • <head>
  • <meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
  • </head>
  • <script language="javascript" type="text/javascript">
  • var JC , JCV , textea , nb2 , nb1 , nb , limite , i , j , x , caract , sup1 , sup2 , choice_affich;
  • function init(){document.getElementById("defaut_affich").checked = true;}
  • function choice_affiche(value){choice_affich = value;}
  • function affich(a)// je met cette fonction ainsi pour ceux qui désire modifier le mode d'affichage....
  • {
  • document.getElementById("texte_2").innerHTML = a;
  • }
  • function choixcaract(form)
  • {
  • if(choice_affich == 2)
  • {
  • caract = "*";
  • sup1 = "^";
  • sup2 = "";
  • }
  • else
  • {
  • if(choice_affich == 1){caract = " . ";}
  • else{caract = " × ";}
  • sup1 = "<sup>";
  • sup2 = "</sup>";
  • }
  • }
  • function JCVD(x)//...Security
  • {
  • JC = parseInt(x);
  • JCV = JC.toString();
  • if(JCV.length == x.length && JCV != "NaN"){return Math.abs(JC);}
  • else{return 0;}
  • }
  • function process(form)
  • {
  • nb = JCVD(form.fact.value);
  • textea = "===> " + nb + " = ";
  • if(nb <= 2)
  • {
  • if(nb != 2){textea += "Ni premier ni composé.";}
  • else{textea += "Nombre premier.";}
  • }
  • else
  • {
  • choixcaract(form);
  • nb1 = nb;
  • j = 0;
  • i = 2;
  • x = 0;
  • limite = Math.sqrt(nb1) + 1;
  • while(1)
  • {
  • if(i>limite)
  • {
  • if(nb == nb1){textea += "Nombre premier.";}
  • else
  • {
  • if(nb1 > 1){textea += caract + nb1;}
  • }
  • break;
  • }
  • nb2=nb1/i;
  • if(nb2 - Math.floor(nb2) > 0.0000000000001)
  • {
  • if(j > 0)
  • {
  • if(x != 0){textea += caract;}
  • else{x = 1;}
  • if(j == 1){textea += i;}
  • else{textea += i + sup1 + j + sup2;}
  • j=0;
  • }
  • i++;
  • }
  • else
  • {
  • j++;
  • nb1=nb2;
  • }
  • }
  • }
  • }
  • </script>
  • <body onLoad="init();">
  • <h1 >Décomposition en facteurs premiers</h1>
  • <p align="center">Lors de la saisie d'un grand chiffre, une fenêtre "Attention: le script ne répond pas" peut s'afficher.
  • <br />Si c'est le cas, cliquez sur "Continuer" autant de fois que cette fenêtre se réactualisera.
  • <br />Et si toutefois le calcul est trop long vous pouvez toujours cliquer sur "Arrêter le script".
  • <br /><br />Indiquez dans le champ ci-dessous un chiffre (entier) à décomposer en facteurs premiers, puis, appuyez sur la touche "Entrée" de votre clavier ou cliquez sur "Décomposer".
  • </p>
  • <br>
  • <form name="decomposition" action="javascript:affich(textea);" onsubmit = "javascript:process(this);">
  • <input type="radio" name="choice_aff" value="0" onChange="choice_affiche(this.value);" id="defaut_affich"/> Affichage basique
  • <br />
  • <input type="radio" name="choice_aff" value="1" onChange="choice_affiche(this.value);"/> Signe de multiplication "."
  • <br />
  • <input type="radio" name="choice_aff" value="2" onChange="choice_affiche(this.value);"/> Affichage en chaîne mathématique utilisable dans une calculatrice informatique (pour copier-coller)
  • <br /><br />
  • <input type="text" name="fact"/>
  • <br />
  • <input type="submit" value="Décomposer"/>
  • </form>
  • <br /><p align="center"><font color="#000000"><strong><i id="texte_2"></i></strong></font></p>
  • </body>
  • </html>
<html>

<head>
	<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
</head>



<script language="javascript" type="text/javascript">

var JC , JCV , textea , nb2 , nb1 , nb , limite , i , j , x , caract , sup1 , sup2 , choice_affich;

function init(){document.getElementById("defaut_affich").checked = true;}

function choice_affiche(value){choice_affich = value;}

function affich(a)// je met cette fonction ainsi pour ceux qui désire modifier le mode d'affichage....
{
	document.getElementById("texte_2").innerHTML = a;
}

function choixcaract(form)
{
	if(choice_affich == 2)
	{
		caract = "*";
		sup1 = "^";
		sup2 = "";
	}
	else
	{
		if(choice_affich == 1){caract = " . ";}
		else{caract = " × ";}
		sup1 = "<sup>";
		sup2 = "</sup>";
	}
}

function JCVD(x)//...Security
{
	JC = parseInt(x);
	JCV = JC.toString();
	if(JCV.length == x.length && JCV != "NaN"){return Math.abs(JC);}
	else{return 0;}
}

function process(form)
{
	nb = JCVD(form.fact.value);

    textea = "===> " + nb + " = ";

	if(nb <= 2)
	{
		if(nb != 2){textea += "Ni premier ni composé.";}
		else{textea += "Nombre premier.";}
	}
	else
	{
		choixcaract(form);
		nb1 = nb;
        j = 0;
        i = 2;
        x = 0;
        limite = Math.sqrt(nb1) + 1;

        while(1)
		{
			if(i>limite)
            {
				if(nb == nb1){textea += "Nombre premier.";}
                else
                {
					if(nb1 > 1){textea += caract + nb1;}
                }
                break;
            }

			nb2=nb1/i;

            if(nb2 - Math.floor(nb2) > 0.0000000000001)
            {
				if(j > 0)
                {
					if(x != 0){textea += caract;}
					else{x = 1;}
                    if(j == 1){textea += i;}
                    else{textea += i + sup1 + j + sup2;}
                    j=0;
                }

                i++;
            }
            else
            {
				j++;
                nb1=nb2;
            }
		}
	}
}

</script>

<body onLoad="init();">



<h1 >Décomposition en facteurs premiers</h1>

<p align="center">Lors de la saisie d'un grand chiffre, une fenêtre "Attention: le script ne répond pas" peut s'afficher.
<br />Si c'est le cas, cliquez sur "Continuer" autant de fois que cette fenêtre se réactualisera.
<br />Et si toutefois le calcul est trop long vous pouvez toujours cliquer sur "Arrêter le script".
<br /><br />Indiquez dans le champ ci-dessous un chiffre (entier) à décomposer en facteurs premiers, puis, appuyez sur la touche "Entrée" de votre clavier ou cliquez sur "Décomposer".
</p>

<br>
<form name="decomposition" action="javascript:affich(textea);" onsubmit = "javascript:process(this);">
  <input type="radio" name="choice_aff" value="0" onChange="choice_affiche(this.value);" id="defaut_affich"/> Affichage basique
  <br />
  <input type="radio" name="choice_aff" value="1" onChange="choice_affiche(this.value);"/> Signe de multiplication "."
  <br />
  <input type="radio" name="choice_aff" value="2" onChange="choice_affiche(this.value);"/> Affichage en chaîne mathématique utilisable dans une calculatrice informatique (pour copier-coller)
  <br /><br />
  <input type="text" name="fact"/>
  <br />
  <input type="submit" value="Décomposer"/>
</form>

<br /><p align="center"><font color="#000000"><strong><i id="texte_2"></i></strong></font></p>

</body>
</html>



 Historique

28 mars 2010 00:35:56 :
Modification (dans la description) du chemin pour la version directement utilisable.
28 mars 2010 00:42:18 :
Modification (dans la description) du chemin pour la version directement utilisable.
28 mars 2010 00:44:08 :
...
28 mars 2010 01:16:11 :
Ajout des cas spéciaux pour 0 et 1.
28 mars 2010 01:32:51 :
rajout d'une petite exception de présentation.
28 mars 2010 01:34:12 :
..
28 mars 2010 01:52:22 :
Oubli de fermeture de balise body et html
28 mars 2010 03:01:04 :
..
28 mars 2010 03:04:06 :
..
28 mars 2010 15:06:42 :
Oubli du Head
30 mars 2010 14:36:44 :
Rajout d'une fonction de saisie pour plus de sécurité (en cas de saisie de caractères alpha par exemple).
02 avril 2010 12:51:40 :
Optimisation du code.
02 avril 2010 12:59:14 :
Optimisation...
06 avril 2010 17:43:20 :
Rajout de quelques fonctions.
06 avril 2010 23:57:09 :
faute d'orthographe...
08 avril 2010 01:22:33 :
Changement de onclick par onsubmit pour pouvoir utiliser la touche entrée (cela permet de supprimer fonction affich() de la fonction process() en ajoutant affich en action dans le form).
11 mai 2010 17:00:08 :
Amélioration de la fonction JCVD.
23 août 2010 14:51:23 :
Modification des options d'affichage.

 Sources du même auteur

CALCUL D'INCERTITUDE
OPÉRATIONS SUR MATRICES

 Sources de la même categorie

Source avec Zip Source avec une capture SLIDESHOW IMAGES ET TEXTES EN PUR JAVASCRIPT par ansuzpeorth
Source avec Zip INPUT TEXT AUTOMATIQUE CREATION SUPPRESSION par lycanges
Source avec Zip Source avec une capture TABLE_SV : TABLEAU DYNAMIQUE, MONTRER/CACHER COLONNE SUR DEM... par synanceia
COLONNES ADAPTABLES EN HAUTEUR par dronoide
Source avec Zip VECTEURS ET MATRICES: OUTILS GRAPHIQUES UTILES par william voirol

Commentaires et avis

Commentaire de jdmcreator le 05/04/2010 15:16:05 7/10

Bonjour =)

Cette fonction est pas mal mieux optimisé que celle que j'avais faite il y a 1 an et qui m'avait valu un 1 ^^ (Je n'étais pas très bon)

De plus, j'aime beaucoup la fonctionnalité de mettre les exposants à la place de plusieurs nombre indiques =)

Par contre, peut-être pourrais-tu penser à mettre une option qui permet de retourner le code en une chaîne mathématique utilisable ;)

Ex : 2 x 3 x 17 serait 2*3*17

Du bon travail ;)

Commentaire de jdmcreator le 05/04/2010 15:17:19

Zut, on ne peut pas  changer les commentaires

Si j'aurais remarqué, j'aurais un peu baissé ta note car ta fonction est en brute : elle utilise la valeur d'un textarea. Passe plutôt la chaîne à décomposer dans un argument.

Commentaire de jdmcreator le 05/04/2010 15:23:04

Quelque chose du genre :

function test(tn){
/*On modifie la chaîne tn*/


return tn;
}

document.getElementById('...').innerHTML=test(form.fact.value);

Si tu vois ce que je veux dire ;)

Commentaire de Minilogus le 06/04/2010 00:16:00

Merci de ton commentaire JDMCREATOR.

En ce qui concerne la fonction test que tu as écrit, je pense que la fonction JCVD qui est déjà implémenté fait ce fameux test.

function JCVD(x)//...Security
{
    JC=parseInt(x);// transforme une chaîne de caractère en valeur numérique (tout ce qui n'est pas numérique est effacé, ainsi que ce qu'il y a après...)
    JCV=JC.toString();// transforme une valeur numérique en chaîne de caractère
    if(JCV.length==x.length){return Math.abs(JC);}// si la chaîne de caractère dans JCV est de taille identique à celle dans x (c'est à dire qu'il n'y a avait aucun caractère alpha lors du passage par parseInt()), renvoyer la valeur absolue de de JC (qui est égal à x dans ce cas).
    else{return 0;}// autrement renvoyer la valeur 0...(ce qui affichera ni premier ni composé, bref pas bon ^^)
}

function process(form)

{
nb=JCVD(form.fact.value);// ici je fait passer le contenu du textarea dans JCVD qui me renverra dans la variable nb la valeur si il n'y a aucuns caractères autres que numérique ou un 0 dans le cas contraire...
//.......
}

Si ce n'est pas ce à quoi je suis sensé penser lorsque tu me parle de fonction test fait le moi savoir ^^.

Pour ce qui est des 2*3*17 au lieu des 2 x 3 x 17 je peut bien évidement modifier/rajouter pour que cela soit possible.

Commentaire de jdmcreator le 06/04/2010 01:15:02

Non, ce n'est pas ce que je voulais dire

C'est plutôt de retourner la valeur de ta fonction process plutôt que de modifier la valeur de ton DIV.... J'ai du mal à m'expliquer...

Commentaire de Minilogus le 06/04/2010 02:05:25

J'avoue que j'ai du mal à comprendre ce que tu demandes, ou plutôt je ne saisi pas l'intérêt. Le mieux serait que tu reprennes un bout de ma source en appliquant tes modifications et que tu la poste ensuite en commentaire. Je pourrait voir par la suite ce que j'ai peut-être oublié dans ma programmation où si c'est tout simplement pertinent.

Commentaire de Minilogus le 06/04/2010 02:25:13

Si j'essaie de comprendre, tu voudrait que la fonction process utilise un return au lieu du "document.getElementById('...').innerHTML" (qu'elle n'utilise qu'une seule fois par processus). Et que je fasse une fonction d'affichage qui utiliserai ce return en "document.getElementById('...').innerHTML" ... Si c'est le cas c'est franchement inutile ici (sur un plan fonctionnel en tout cas). Mais bon, ça ne pose pas de problème à modifier.

Commentaire de amrounix le 12/07/2010 17:16:16

j'ai ecrit un petit bout de code qui te retourne la même chose :

<script language="javascript">
function pgc(x,lst)
{
i = 2;
fin = parseInt(x/2,10) + 1;
while (i<fin)
{
if (x%i==0)
{
lst.push(i);
return pgc(parseInt(x/i,10),lst);
}
i++;
}
if (i==fin)
{
lst.push(x);
}
return lst;
}

lstDiviz = pgc(11*11*13*17*5*11,new Array());
alert(lstDiviz.join(","));
</script>

Commentaire de Minilogus le 13/07/2010 15:19:49

C'est bien mais il faudrait expliquer l'algorithme de ton code... histoire qu'on s'y retrouve ^^. Personnellement je ne suis pas arrivé à le faire fonctionner... . Tu devrait y accoler un formulaire et reposter.

Commentaire de amrounix le 13/07/2010 16:00:15

voila une version un peu plus détaillé, prêt à être copier-coller dans un fichier






<html>
<script language="javascript">
/*
methode de composition en facteur premier
x : valeur , lst : tableau de la décomposition
*/
function pgc(x,lst)
{
i = 2; /*on test de division de x/i avec i allant de 2 à x/2 ( ca sert à rien d'alleur au dessus) */
fin = parseInt(x/2,10) + 1;
while (i<fin) /*on boucle jusqu'a fin (si ca sort c'est qu'il y'a plus de division possible) */
{
if (x%i==0) /*test du modulo de x par i (modulo : resultat de la division, si ==0 alors le nombre est divisible) */
{
lst.push(i); /*si le nombre est divisible alors on le met dans la liste*/
return pgc(parseInt(x/i,10),lst); /*on rappel la méthode en récursive*/
}
i++; /*on incrément i pour la boucle, ca signifie que le nombre n'est pas divisible par i */
}
if (i==fin||x<2) /*on récupère le dernier élement (+cas extrême) et on le place dans la liste*/
{
lst.push(x);
}
/*on retourne la liste*/
return lst;
}

/*méthode de calcul et d'affichage de la décomposition
val : valeur a décomposer */
function calcul(val)
{
/*test si c'est un chiffre*/
if (!(/^\d+$/).test(val)) {alert("ce n'est pas un nombre !"); return;}
/*récupère la liste a décomposer*/
listDecompose = pgc (parseInt(val,10),new Array());
/*affiche la réponse en séparant les éléments de la liste par "*" */
document.getElementById("resultat").value = listDecompose.join("*");
}

</script>
<body>
Entrer un nombre :<input type="text" id="nbre"/>&nbsp;<input type="button" onclick="calcul(document.getElementById('nbre').value);" value="calcul"/><br/>
Resultat de la d&eacute;composition : <input type="text" id="resultat"/>
</body>
</html>

Commentaire de Minilogus le 11/08/2010 14:09:21

@AMROUNIX,

j'ai testé ton code que je trouvais bien, mais je me suis aperçu qu'il est beaucoup plus gourmand en ressource que le mien lorsque j'ai entré 98765432198998
En effet, à la saisie de ce chiffre avec ton code, le navigateur lance la fenêtre "le script ne répond pas" ce qui est normal avec de si grand chiffre, mais ne semble pas reprendre, ou met énormément de temps à finir ça tâche, une fois que l'on clique sur continuer. Alors que celui de la source fini avant d'en arriver à la fameuse fenêtre.

Ton code aborde une approche plus "technique" que mathématique du javascript qui manifestement semble préjudiciable au niveau des performances.

Commentaire de proftnj le 23/08/2010 03:18:56 9/10

De très petites modifications pour que l'affichage du résultat soit compréhensible par de jeunes étudiants:

--------------------

<script language="javascript" type="text/javascript">
function affich(a)// je met cette fonction ainsi pour ceux qui désire modifier le mode d'affichage....
{
document.getElementById("texte_2").innerHTML=a;
}
function choixcaract(form)
{
if(form.choice.checked){return " . ";}
else{return " × ";}
}
var JC , JCV;
function JCVD(x)//...Security
{
JC=parseInt(x);
JCV=JC.toString();
if(JCV.length==x.length && JCV!="NaN"){return Math.abs(JC);}
else{return 0;}
}
var textea , nb2 , nb1 , nb , limite , i , j , x , caract;
function process(form)
{
        nb=JCVD(form.fact.value);
        textea="résultat : "+nb+" = ";
if(nb<=2)
{
if(nb!=2){textea +="Ni premier ni composé.";}
else{textea +="Nombre premier.";}
}
else
{
caract=choixcaract(form);
nb1=nb;
         j=0;
         i=2;
         x=0;
         limite=Math.sqrt(nb1)+1;
         while(1)
{
             if(i>limite)
             {
                 if(nb==nb1){textea +="Nombre premier.";}
                 else
                 {
                     if(nb1>1){textea +=caract+nb1;}
                 }
                 break;
             }
nb2=nb1/i;
             if(nb2-Math.floor(nb2)>0.0000000000001)
             {
                 if(j>0)
                 {
                     if(x!=0){textea +=caract;}
else{x=1;}
                     if(j==1){textea +=i;}
                     else{textea +=i+"<sup>"+j+"</sup>";}
                     j=0;
                 }
                 i++;
             }
             else
             {
                 j++;
                 nb1=nb2;
             }
}
        }
}
</script>

Commentaire de Minilogus le 23/08/2010 15:07:58

Merci de ta contribution PROFTNJ. J'ai opéré des modifications dans l'option d'affichage en reprenant un peu de ton idée. J'ai divisé l'option en 3:
-Basique
-Symbole "X" ou "."
-Chaîne mathématique insérable dans un système de calcul informatique standard par copier-collé (cela m'a été demandé par JDMCREATOR [cf: premier commentaire], en tout cas j'ai compris ça comme cela)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Script pour une décomposition de chaine de caractères [ par sebtoto62 ] Salut, je voudrais, apr&#232;s avoir r&#233;cup&#233;r&#233; une chaine de caract&#232;res, la d&#233;composer en plusieurs. Pour cela, il y a un &#23 débtante en java [ par hananetsdi ] <TD id=HB_Focus_Element vAlign=top width="100%" background="" height=250 UNSELECTAB Selectio des 2 premiers caracteres d'un champ input text [ par tom6666 ] Salut à tous.Je ne suis pas très familier avec javascript et j'aimerais qu'a l'évènement onFocus sur un &lt;input type='text'&gt; les 2 premiers carac


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,123 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales