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

JavaScript Discussion :

Nombres premiers Algo/JS


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Nombres premiers Algo/JS
    Bonjour
    j''ai cree un algo qui permet d'afficher les nombres premiers de 1 à 100 ,
    voivi l'algo
    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
    VARIABLES
      i EST_DU_TYPE NOMBRE
      b EST_DU_TYPE NOMBRE
      c EST_DU_TYPE NOMBRE
    DEBUT_ALGORITHME
      POUR i ALLANT_DE 1 A 100
        DEBUT_POUR
        b PREND_LA_VALEUR 0
        POUR c ALLANT_DE 2 A (sqrt(i))
          DEBUT_POUR
          SI (i%c == 0) ALORS
            DEBUT_SI
            b PREND_LA_VALEUR 1
            FIN_SI
          FIN_POUR
        SI (b == 0) ALORS
          DEBUT_SI
          AFFICHER* i
          FIN_SI
        FIN_POUR
    FIN_ALGORITHME
    et j'ai essayé de resaisir le meme code sous JS mais sans resultats. il ne fonctionne pas

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Popo3005 Voir le message
    il ne fonctionne pas
    Avec ça on est bien avancés. Si tu nous montrais ce que tu as essayé, et les résultats que ça a donné ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    j'ai essayé ça
    Code HTML : 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
    <HTML>
        <BODY>
    	    <SCRIPT type="text/Javascript">
                     for (i=1; i<=100; i++)
                            {for (j=2;j<=(sqrt(i));j++)
                                    {a=i%j;
                                            if (a==0)
                                            {alert("0");
                                            continue;
                                            }
                                            alert(i);
                                    }
                            }       
                    </SCRIPT>
        </BODY>
    </HTML>
    petite précision c'est le code js qui marche pas

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    la fonction "sqrt" n'existe pas. C'est la méthode "Math.sqrt" qu'il faut utiliser.

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    C’est dommage les déclarations de variables qui sont parties aux oubliettes… C’est pourtant une bonne habitude à prendre.
    JavaScript est faiblement typé mais ça ne nous empêche pas de déclarer les variables avec var ou let.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let i, j, a;
    for (i=1; ... // etc
    Le mode strict permet de repérer rapidement les variables qui n’ont pas été déclarées. Si tu débutes en JS, je te conseille fortement d’adopter immédiatement le mode strict pour tous tes projets. Crois-moi, ça te rendra la vie plus facile

    alert c’est sympa mais ça interromp l’exécution et ça requiert à chaque fois une intervention à la main pour continuer. Pour déboguer des scripts plus longs, ça se révèle vite fastidieux. Remplace tous les alert par des console.log puis ouvre la console de ton navigateur avec F12. Tu verras, c’est bien plus pratique
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    c'est vrai qu'avec console.log c’est bien plus pratique.
    J'ai autre problème
    ce script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <HTML>
        <BODY>
    	    <SCRIPT type="text/Javascript">
    		 for (i=2; i<=100; i++)
    			{for (j=2;j<=(Math.sqrt(i));j++)
    				{a=i%j;
    				if (a==0)
    				{alert(i);}}}
    		</SCRIPT>
        </BODY>
    </HTML>
    affiche les nombres non premiers à partir de 4
    mais celui ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <HTML>
        <BODY>
    	    <SCRIPT type="text/Javascript">
    		 for (i=2; i<=100; i++)
    			{for (j=2;j<=(Math.sqrt(i));j++)
    				{a=i%j;
    				if (a!=0)
    				{alert(i);}}}
    		</SCRIPT>
        </BODY>
    </HTML>
    affiche les nbres premiers tels que 5 ;7 mais il affiche aussi 9;10;16;21
    vous auriez une idée du probléme??

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Ton idée d’utiliser le modulo est bonne, cependant ton algo ne fait pas exactement ce que tu veux. Il ne détermine pas les nombres premiers, mais des couples de nombres qui sont premiers entre eux. Et pas tous (par exemple, 10 et 7 sont premiers entre eux mais ton algo ne le détecte pas car 7 est supérieur à la racine carrée de 10).

    Avec une toute petite modification dans ton code, tu peux t’en rendre compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (i = 2; i <= 100; i++)
    {
      for (j = 2; j <= (Math.sqrt(i)); j++)
      {
        a = i % j;
        if (a != 0)
        {
          console.log(`(${i}, ${j})`);
        }
      }
    }
    (je me suis permis de reformater ton code avec http://jsbeautifier.org/)

    Ce nouveau code affiche en sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (5, 2) 
    (7, 2) 
    (9, 2) 
    (10, 3) 
    (11, 2) 
    (11, 3) 
    (13, 2) 
    (13, 3) 
    (14, 3) 
    (15, 2) 
    (16, 3) 
    (17, 2)
    ...
    Il faut que tu revoies ton algorithme. Tu vas devoir procéder par élimination, à la manière du crible d’Ératosthène. En disant ça, j’en ai déjà trop dit, je vais te laisser chercher
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  8. #8
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci bcp de votre aide le crible d'érasthosténe j'y avais penser mais là le travail est bcp plus long.Je ne sais pas si je peux le raccourcir
    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
     
    	var nbr_pre =[3,5,7,11,13,17] ,
            length = nbr_pre.length,
    	min = nbr_pre[length-1] + 2,
        max = parseInt(prompt('Nombre maximum :'));  
    for (var nbr = min; nbr < max; nbr += 2) {
        var isPrime = true, moitier = (nbr + 1) / 2;
        for  (var id in nbr_pre) {
            if (!isPrime) {
                break;
            }
            if (nbr_pre[id] < moitier) {
                var reste_nbr = nbr % nbr_pre[id];
                if (reste_nbr == 0) {
                    isPrime = false
                }
            }
            else {
                break;
            }
        }
        if (isPrime) {
            nbr_pre.push(nbr);
        }
    }
     
    for (var id in nbr_pre) {
        console.log(nbr_pre[id]);
    }

  9. #9
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 175
    Points
    17 175
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let nbr, i, j
    for (i = 2; i <= 100; i++)
    {
        nbr = 0;
        for (j = 1; j <= (Math.sqrt(i)); j++)
        {
            if (i % j == 0) {nbr += 1;}
        } //--- for j ---
        if (nbr == 1){console.log(i);}
    } //----- for i ---
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  10. #10
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour le script

  11. #11
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    On nous avez donné cet exercice dans ce forum : ici, voici quelle était ma réponse : http://jsbin.com/tenaguyage/edit?js,console

    On nous avez pas demandé d'optimiser avec la racine carrée mais c'est facile à ajouter comme ProgElecT l'a montré... On pourrait combiner les optimisations en ajoutant un break et unelse au code de ProgElecT...

    Et si on veut du très concis voir la réponse de Sylvain...

  12. #12
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Je me suis ré-intéressé au problème ces derniers jours;

    http://javatwist.imingo.net/premiers.htm

    j'arrive à mon meilleur timing avec ce code:

    Code html : 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
    <html>
    <head>
    <meta charset="iso-8859-1" />
    <title>...</title>
    <style type="text/css">
    #premiers{margin:auto;text-align:center;max-width:500px}
    </style>
    </head> 
    <body>
    <div id="premiers"></div>
    <script> 
    let tab=[2,3,5,7,11,13];
    let i=17;
    console.time("t");
    while(i<1000000){
    if(i%3>0 && i%5>0 && i%7>0 && i%11>0 && i%13>0){
            let n;let j=17;
            while (j*j<=i){if(i%j===0){n=true;break};j+=2;} 
            if(!n){tab.push(i)}};i+=2;};
     
    document.getElementById("premiers").textContent=tab.join(" ")
    console.timeEnd("t"); 
    </script>
    </body> 
    </html>

    - Les conditions sur les 6 premiers nombres premiers permettent de gagner quelques millisecondes non négligeables;
    - regrouper les conditions dans une boucle prend plus de temps;
    - Plus ou moins de conditions ponctuelles ont tendance à augmenter le temps;
    - whilefait gagner un peu de temps par rapport à for;
    - une décrémentation avec while ne génère aucun progrès;
    - tester que le nombre n'est divisible par aucun élément de tab prend plus de temps;
    - etc.

    Et vous, vous en êtes où en terme d'optimisation ???

  13. #13
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    après nouveaux tests, itérer sur tab donne de bons résultats;

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    console.time("t");
    let tab=[3,5,7,11,13];
    let i=17;
    while(i!==1000001){
    	if(i%3>0 && i%5>0 && i%7>0 && i%11>0 && i%13>0){
    		let n, j=4;
    		while (tab[j]**2<=i){if(i%tab[j]<1){n=true;break};j++;}	
    		if(!n){tab.push(i)}
    	};
    	i+=2;
    };
    document.getElementById("premiers").textContent=2+" " +tab.join(" ")
    console.timeEnd("t");

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

Discussions similaires

  1. Réponses: 24
    Dernier message: 27/09/2005, 21h16
  2. [défi n°8]: premiers nombres premiers
    Par javatwister dans le forum Général JavaScript
    Réponses: 41
    Dernier message: 14/06/2005, 10h22
  3. [LG]Calcul des 15 premiers nombres premiers
    Par yffick dans le forum Langage
    Réponses: 12
    Dernier message: 18/09/2004, 14h57
  4. Cripter avec des nombres premiers
    Par clovis dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/04/2004, 19h10
  5. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

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