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

Java Discussion :

[debutant] Algorithme nombres premiers!


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Par défaut [debutant] Algorithme nombres premiers!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class NombrePremier
    { static int d=2;
    static void premier(n)
     { for(d=2;d<n; d++)
        {if(n%d==0) break;}
       if (n%d==0) System.out.println(n+"n'est pas premier")
       else System.out.println(n+"est premier")
     }
    }
    quand j'execute ce programme, 9 est premier!! ça me parait bizzare.quelqu'un pourrait-il m'expliquer pourquoi 9 apparait premier dans ce programme?

    Et quand je fais break, je sors de la boucle avec quelle valeur de d, est c'est la valeur de d(static int d=2) ou la dernière valeur de d avant de sortir de la boucle.
    merci d'avance

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Salut,

    Ton programme ne compile pas.
    Pourquoi mets-tu d en static ? Pourquoi n'y a t'il pas de typage pour n ?

  3. #3
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    et si on fait les petites corrections qui s'imposent, c'est l'inverse de ce que tu dis qui se produira: même les nombres premiers seront considérés comme 'pas premiers' (genre '5').

    La raison est simple: lorsque tu sors de la boucle for, c'est que la condition (d<n) n'était plus remplie. En d'autres termes, c'est que d vaut la première valeur qui ne remplit plus la condition (à savoir la valeur 'n'), et ne vaut pas la dernière valeur pour laquelle la boucle a été exécutée (n-1).

    Un algo qui fonctionne ressemblerait plutôt à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void premier(int n) {
    	for(d=2;d<n; d++) {
    		if(n%d==0) { 
    			System.out.println(n+"n'est pas premier ("+n+"/"+d+" = "+(n/d)+")");
    			return;
    		}
    	}
    	System.out.println(n+"est premier.");
    }
    PS: pour optimiser l'algo, tu peux itérer pour un 'd' valant entre 2 et racine carrée de 'n'. De même, tu peux d'emblée éliminer toutes les valeurs paires.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Par défaut
    En fait un nombre premier n est un nombre dont les seuls diviseurs sont 1 et n.Mon programme consiste à sortir de la boucle dès qu'il y a un d(different de 0 et de 1) qui divise n.Supposons que n=9 et que je sors de la boucle avec la valeur d=3 car 3 divise 9.La question que je me pose est la suivante: est ce que la valeur de d va être 3 au contraire elle reste 2(à cause de static int d=2)?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Par défaut
    si mon programme compile belle et bien, j'ai omis de mettre premier(int n)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Je crois qu'on a tous compris le principe de ton algorithme, même mal codé

    Citation Envoyé par Javamar Voir le message
    La question que je me pose est la suivante: est ce que la valeur de d va être 3 au contraire elle reste 2(à cause de static int d=2)?
    "static" ne veut pas dire "final"... A la sortie de la boucle, d vaut bien 3.
    Cependant, comme on te l'a expliqué plus haut, si on sort "normalement" de la boucle (c'est-à-dire sans passer par le break) c'est parce que d vaut n. Et donc le test qui suit renverra toujours vrai (n%n==0), et donc les nombres premiers ne seront pas reconnus.
    De plus, tu n'as aucun besoin de déclarer une variable d statique si c'est pour l'utiliser de manière locale dans une boucle...

    Une fonction qui marche :
    EDIT : arf nan, nouknouk l'a déjà postée

  7. #7
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par Javamar Voir le message
    En fait un nombre premier n est un nombre dont les seuls diviseurs sont 1 et n
    Lol. tu m'en apprends dis-donc !

    Mon programme consiste à sortir de la boucle dès qu'il y a un d(different de 0 et de 1) qui divise n.Supposons que n=9 et que je sors de la boucle avec la valeur d=3 car 3 divise 9.La question que je me pose est la suivante: est ce que la valeur de d va être 3 au contraire elle reste 2(à cause de static int d=2)?
    Le static dit [EDIT: grilled par Astartee ; chacun son tour ]

    Mais je réaffirme ce que j'ai dit ci-dessus: l'aglo tel que tu nous l'a présenté (et modulo les fautes de syntaxe) ne trouvera pas '9' comme nombre premier. Au contraire, aucun nombre qu'on lui donnera ne sera considéré comme premier.

    si mon programme compile belle et bien, j'ai omis de mettre premier(int n)
    Et quelques points-virgule également

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Par défaut
    Vous avez peut-être raison de dire que au sortir de la boucle d=n.En fait moi je ne pense pas la même la chose que vous.Moi je me dis que dès lors qu'il va exister un d qui est tel que n%d==0, on sort de la boucle(grâce au break), on ne continue plus à regarder d'autres d(à incrementer).C'est déja suffisant pour dire que n n'est pas premier parceque nous avons trouvé une autre valeur qui divise n autre que 1 et N

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

Discussions similaires

  1. Algorithme d'un nombre premier
    Par Kumral dans le forum Débuter
    Réponses: 7
    Dernier message: 13/10/2018, 09h58
  2. algorithme des nombres premiers
    Par sali2801 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/11/2010, 17h28
  3. debutant:perl et nombre premier
    Par Shyboy dans le forum Langage
    Réponses: 7
    Dernier message: 22/05/2006, 16h01
  4. 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