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

avec Java Discussion :

Nombre premiers et calculer la racine carrée d'un nombre


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut Nombre premiers et calculer la racine carrée d'un nombre
    Bonjour,

    C'est la première fois que je poste sur ce site, donc je ne sais pas si c'est vraiment la bonne catégorie. J'essaie d'écrire un petit programme java qui détermine si un nombre est premier ou non, ça donne ça:

    if (nombreEntré % 2 != 0)
    System.out.println(nombreEntré +" est un nombre premier");
    else if(nombreEntré % 2 == 0 && nombreEntré != 2)
    System.out.println(nombreEntré +" n'est pas un nombre premier");

    mais si je rentre 51 (qui n'est pas un nombre premier) il me dit qu'il est premier parce qu'il est impair. Ma question est de quel façon faut-il modifier le programme pour qu'il détecte les nombre impairs composés comme étant non premiers?

    Et je cherche à exprimer la racine carrée d'un nombre, mais sans math.sqrt(), plutôt avec des boucle if...else ou while. y'a t'il un moyen?

    Merci d'avance

  2. #2
    Membre actif Avatar de akrom
    Homme Profil pro
    Automaticien
    Inscrit en
    Mai 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 115
    Points : 201
    Points
    201
    Par défaut
    Voila une fonction pour calculé une racine carre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Double racineCarre(Double nombre){
            double resultat = 0 ;
            double rc2;
            int i=0;
            double rc1=1;
     
            while(i<100){
                resultat=0.5*(rc1+(nombre/rc1));
                rc1=resultat;
                i++;
            }
            return resultat;
        }
    Plus le nombre de tour de boucle est important plus le résultat sera précis
    On peut tout faire seul avec de la persévérance mais ça va plus vite à plusieurs.

    Je ne répondrais pas aux questions technique par MP .

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    c'est plutot dans la section algorithme que tu devrais aller. Savoir si un nombre est premier ou pas, c'est un algorithme récursif, qui basiquement va parcourir tous les nombres de 1 à SQRT(N) pour voir si ils divisent N. Quand à la racine carrée 'à la main', il existe plus algorithme, faire une recherche sur le net. Pareil d'ailleurs pour l'algorithme des nombres premiers.

  4. #4
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	public boolean isPremier(int n) {
    		boolean isPremier = true;
    		if (n < 0) {
    			isPremier = false;
    		} else if (n != 0 && n != 1) {
    			for (int i = 2; i <= n/2; i++) {
    				if (n != i && n % i == 0) {
    					isPremier = false;
    					break;
    				}
    			}
    		}
    		return isPremier;
    	}
    premier lien google avec "nombre premier java"
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    comme je l'ai dit n/2 sert à rien, on s'arrête à la racine carré :p

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    et juste pour info : le %2 te dira si le nombre est impair ou non et non si il est premier.

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Sia,

    Comme si souvent, l'algorithme est une simple traduction dans le langage visé de ce que tu dois faire à la main pour décider.

    Pour les puristes en math : on parle ici d'algorithme basique, ce qui est attendu pour un tel exercice de cours.
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut
    Merci pour vos réponses. Pour les racines carrées, ça ressemble à ceci:

    0 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 4 4...
    on voit qu'il y a des répétitions et que
    0 se répète 1 fois
    1 se répète 3 fois
    2 se répète 5 fois
    3 se répète 7 fois

    J'ai juste trouvé que les nombres se répète 2n+1 fois , mais je ne sais pas si ça va m'aider

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    on l'a dit, une simple recherche en ligne et tu trouveras des algorithmes de base pour le faire.
    des plus simples
    http://fr.wikipedia.org/wiki/Méthode_de_Héron

    aux plus tordues et limitées

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	inline float sqrt(float number) {
        long i;
        float x, y;
        const float f = 1.5F;
     
        x = number * 0.5F;
        y  = number;
        i  = * ( long * ) &y;
        i  = 0x5f3759df - ( i >> 1 );
        y  = * ( float * ) &i;
        y  = y * ( f - ( x * y * y ) );
        y  = y * ( f - ( x * y * y ) ); // si on veut plus de précision
        return number * y;
    }

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut
    Merci, j'ai trouvé ce que je je cherchais. J'essaie de faire des bouche for des while, mais cela ne fonctionne pas

    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
    if (nombreEntré < 2)
                    {
                        premier = false;
                    }
     
                    for (int i = 2; i*i <= nombreEntré; i++)
     
     
                    if (nombreEntré % i == 0)
                        {
                            premier = false;
                        }
     
     
                        if (premier)
                        {
                            System.out.println(nombreEntré + " est un nombre premier");
                        }
                    else
                    {
                        System.out.println(nombreEntré + " n'est pas un nombre premier");
                    }
    le for deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 2
    while(i * i <= nombreEntré)
    i = i + 1
    selon moi, mais ça ne fonctionne pas

  11. #11
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Dans la boucle for : tu fait TOUT LE TEMPS des System.out.println ...
    Affiche le résultat seulement à la fin :
    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
                    if (nombreEntré < 2)
                    {
                        premier = false;
                    }else{//Pas la peine d'entrée dans la boucle for
                      int indice = i*i;//Utiliser un entier fixe. rmq : i*i dans la boucle for sera tous les temps recalculer et augmentera tous le temps
                    for (int i = 2; indice <= nombreEntré; i++){
     
     
                    if (nombreEntré % i == 0)
                        {
                            premier = false;
                            break; // Pas la peine de continuer dans la boucle
                        }
     
                    }}
                    if(premier) System.out.println(nombreEntré +" est premier");
                    else System.out.println(nombreEntré +" n'est pas premier");
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    Dans la boucle for : tu fait TOUT LE TEMPS des System.out.println ...
    Désolé mais non, son for ne contient que le if, ce qui est correct.

    Par contre, j'aurais tendance à sortir de la boucle dès que premier==false pour aller plus vite, mais ce n'est pas catastrophique pour débuter.

    Pourquoi tu veux changer ton for en while?

  13. #13
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Tu as raison, je n'avais pas remarqué qu'il n'avait pas mis les acolades au for .
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut
    Est-ce qu'il ya moyen? sinon je vais je laisser comme ça

  15. #15
    Membre actif Avatar de akrom
    Homme Profil pro
    Automaticien
    Inscrit en
    Mai 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 115
    Points : 201
    Points
    201
    Par défaut
    il faut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int i = 2; i*i <= nombreEntré; i++)
     
     
                    if (nombreEntré % i == 0)
                        {
                            premier = false;
                        }
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int i = 2
    while(i * i <= nombreEntré){
    if (nombreEntré % i == 0)
                        {
                            premier = false;
                        }
    i = i + 1;
    }
    Mais je n'en vois pas l'utilité.
    On peut tout faire seul avec de la persévérance mais ça va plus vite à plusieurs.

    Je ne répondrais pas aux questions technique par MP .

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 44
    Points
    44
    Par défaut
    Merci, je voulais juste savoir si ça se faisait (parce que l'on parle de deux boucles) et si oui comment

  17. #17
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    je voulais juste savoir si ça se faisait (parce que l'on parle de deux boucles)
    while et for c'est la même chose... mais en différent
    Lors de la création de l'univers il y avait le while. Mais les astres voulait quelque chose de plus rapide à écrire, de plus compacte. Et le for naquit des entrailles du while.
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Diviser le nombre par deux ce n'est pas la bonne méthode, ce n'est même pas une version naïve. L'algorithme de base pour détecter si un nombre est premier est le crible d'Eratoshtène. Pour des nombres pas trop grand c'est largement suffisant.

    Bon article avec animation : http://fr.wikipedia.org/wiki/Crible_...atosth%C3%A8ne



    Après on trouve tout un tas d'algorithmes très compliqués pour aller plus loin, car les propriétés des nombres premiers sont utilisés en cryptanalyse entre autre.

  19. #19
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le crible a pour but de trouve TOUS les nombres premiers < N, pas de vérifier si un nombre est premier C'est exagéré (tant en termes d'opérations que de mémoire) par rapport au simple fait de vérifier les divisions

  20. #20
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Pau,

    +1 sur tchize_
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. Calcul de la racine carrée d'un nombre
    Par Anomaly dans le forum Télécharger
    Réponses: 3
    Dernier message: 04/11/2013, 23h16
  2. Calculer la racine carrée d'un nombre d'une façon particulière
    Par Roud9 dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 29/09/2010, 03h11
  3. Réponses: 2
    Dernier message: 17/02/2007, 05h43
  4. Comment calculer une racine carrée ?
    Par Poseidon62 dans le forum Ada
    Réponses: 9
    Dernier message: 28/11/2006, 00h29
  5. la racine carré d'un nombre
    Par aziz jim dans le forum C++
    Réponses: 4
    Dernier message: 07/08/2006, 14h31

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