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

Langage Java Discussion :

projet nombres premiers


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut projet nombres premiers
    bonjour !

    j' ai dans un projet, 7 fonctions à créer. J' en ai créé 4. La 5ème me crée un sérieux problème.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
     
    //MINI PROJET NOMBRES PREMIERS
     
    public class ProjetNombresEntiers
    {
     
    		public static void main (String [] args )
    		{
    			afficheNpremiers(12);
    		}
    		//un nombre entier p divise un nombre entier q si le reste de la division entiere de p par q est zero.
     
     
     
    		//a)écrire  une fonction booléene qui, etant donnés deux entier strictement positif p et q, test si p divise q.
    		public static boolean divise (int p, int q) // la fonction est booléenne, d' où le type boolean de la fonction que j' ai appelé divise
    		{
    			boolean verite = false; // création de la variable booléenne (verite) qui sera retournée puis son initialisation à false
     
    			if(p%q == 0) // si p modulo q (reste de la division de p par q) est égale à zéro
    			{
    				verite = true; // alors la variable booléenn est vrai. Car dans ce cas, p divise q
    			}
     
    			else // sinon,
    			{
    				verite = false; // c' est faux, d' où false
    			}
     
    			return verite; // retouner la variable booléenne
    		}
     
    		// b) Ecrire une fonction qui, etant donné un entier p, rend le nombre de diviseur de p. exemple:12 a 6 diviseur:1,2,3,4,6,12
    		public static int nombreDiviseurs(int p)
    		{
    			int nbreDiv = 2; //Parce qu' un nombre entier a forcément au moins 2 diviseurs. Sauf le nombre 1. D' où la ligne suivante.
     
    			if (p == 1) // Donc, dans le cas où p = 1
    			{
    				nbreDiv = 1; // nombre de diviseurs = 1. Evidement !
    			}
     
    			else // Autrement (si p différent de 1)
    			{
    				// on parcours tous les nombres de 2 à un nombre inférieur à p (parce que 1 et p sont déjà comptés ((voir première ligne int nbreDiv = 2;)
    				for (int i = 2; i < p; i++) 
    				{
    					if(p % i == 0) // si un de ces nombres est un diviseur de p
    					nbreDiv++; // alors, augmenter de 1 le nombre de ces diviseurs
    				}
    			}
     
    			return nbreDiv; //  retourner (ou rendre) le nombre de diviseurs trouvés.
    		}
     
    		// c)  Un nombre est premier s'il n'est divisible que par 1 et par lui meme. exemple:13 est premier ,21 ne l'est pas. 	
    		// Ecrire  une fonction isPremier en utilisant la fonction de b.
    		public static boolean isPremier(int p)
    		{
    			boolean verite = false; // création de la dariable booleenne
     
    			// La fonction b) donne le nombre de diviseurs d' un entier p
    			if(nombreDiviseurs(p) == 2) // Si cenombre est inférieur ou égal à 2
    			{
    				verite = true; // alors, ce nombre est premier
    			}
    			else // autrement,
    			{
    				verite = false; // ne nombre n' est pas premier
    			}
     
    			return verite; // retourner la booléenne, évidement
    		}
     
    		// d. En fait, si l'on trouve un diviseur pour un nombre p qui est différent de 1 et de p, on peut en déduire immédiatement que p n'est pas premier.
    		// Ecrire une fonction isPremier utilisant cette propriété.
    		public static boolean isPremier2(int p)
    		{
    			boolean verite = false; // création de la dariable booleenne
     
    			if(p == 1)
    			{
    				verite = false; //Car 1 n' est pas un nombre premier
    			}
    			else // autrement
    			{
    				for(int i = 2; i < p; i++) // de tous les nombres compris entre 2 et un nombre inférieur à p
    				{
    					if(p % i == 0) // si p divise un de ces nombres
    					{
    						verite = false; // alors p n' est pas premier car p est premier seulement s' il divise 1 et lui même
    						break; // sortir de la boucle car on a déjà trouvé un diviseur différend de 1 et de p 
    					}
    					else
    					verite = true;
    				}
    			}
    				return verite; // retourner la booléenne, évidement
    		}
     
    		//e.  Améliorer en ne considérant comme diviseurs que le nombre 2 et les nombres impairs (en effet si un nombre n'est pas divisible par 2, il ne sera divisible     
    		// par aucun nombre pairs !)
     
    		public static boolean isPremier3(int p)
    		{
    			boolean verite = false; // création de la dariable booleenne
     
    			if(p == 1)
    			verite = false;
     
    			if(p == 2)
    			verite = true;
     
    			int reste = (p % 2); // la variable reste = reste de la division de p par 2
     
    			switch(reste)
    			{
    				case 0: // au cas où ce reste = 0, p est  divisible par 2 
    				verite = false; // p ne peut donc plus être premier
    				break;
     
    				default:// dans l' autre cas (forcément reste = 1) p n' est pas divisible par 2
    				for(int i = 2; i < p;  i++)
    				{
    					if(i % 2 == 0) // si i est un multiple de 2
    					continue; // ne pas en tenir compte. Donc continuer à la valeur suivante. Car p n' est pas divisible par tous les multiples de 2
     
    					if(p % i != 0) // 
    					verite = true;
    					else
    					verite = false;
    				}
    				break;
    			}	
     
    			return verite;
     
     
     
    		}
     
     
     
     
     
     
     
     
     
     
    }
    /*
    MINI PROJET NOMBRES PREMIERS
     
       Un nombre entier p divise un nombre entier q si le reste de la division entière de p par q est zéro.
     
       a. Ecrire une fonction boolenne qui, étant donnés deux entiers strictement positifs p et q, teste si p divise q.
     
       b. Ecrire une fonction qui, étant donné un entier p, rend le nombre de diviseurs de p.
       exemple : 12 à  6 diviseurs : 1,2,3,4,6,12
     
       c.Un nombre est premier s'il n'est divisible que par 1 et par lui-même.
       exemple : 13 est premier , 21 ne l'est pas.
     
       Ecrire la fonction isPremier en utilisant la fonction de b.
     
       d. En fait, si l'on trouve un diviseur pour un nombre p qui est différent de 1 et de p, on peut en déduire immédiatement que p n'est pas premier.
       Ecrire une fonction isPremier utilisant cette propriété.
     
       e.  Améliorer en ne considérant comme diviseurs que le nombre 2 et les nombres impairs (en effet si un nombre n'est pas divisible par 2, il ne sera divisible     
       par aucun nombre pairs !)
     
       f.  Améliorer en arretant les tests lorsque le diviseur dépasse la racine carrée de n. (en effet, si un diviseur de p est supérieur à la racine carrée de n, le quotient est donc inférieur à n et aura été trouvé avant).
     
       g. Ecrire une fonction affichant la liste des n premiers nombres premiers inférieurs à partir de 2..
     
    */
    si vous pouviez m' aider sur cette 5ème fonction au moins. (e)...

    merci d' avance
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut correction
    erreur !

    supprimer la ligne dans la fonction main().

    j' avais tenté d' écrire la 7ème fonction (g) sans passer par les 5ème et 6ème.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Par défaut
    Salut,

    Déjà :
    Citation Envoyé par raph707
    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
     
    //MINI PROJET NOMBRES PREMIERS
     
    public class ProjetNombresEntiers
    {		
    		//e.  Améliorer en ne considérant comme diviseurs que le nombre 2 et les nombres impairs (en effet si un nombre n'est pas divisible par 2, il ne sera divisible     
    		// par aucun nombre pairs !)
     
    		public static boolean isPremier3(int p)
    		{
    // ...
    			int reste = (p % 2); // la variable reste = reste de la division de p par 2
     
    			switch(reste)
    			{
    				case 0: // au cas où ce reste = 0, p est  divisible par 2 
     // ...
    Un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(reste == 0) {
    } else {
    }
    serait plus approprié à la place du switch.

    Ensuite Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i = 2; i < p;  i++)
    Tu peut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i = 2; i < p;  i = i +2)
    ça t'éviteras de tester la parité de i

    Pour finir voici le code qui devrait fonctionner :
    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
    public static boolean isPremier3(int p) {
    		boolean verite = true; // initialisée à true ainsi si toute la boucle
    		// suivante est parcourue, c'est que le nombre
    		// est premier
     
    		if (p == 1) {
    			verite = false;
    		} else if (p == 2) {
    			verite = true;
    		} else {
    			int reste = (p % 2); // la variable reste = reste de la division
    			// de p par 2
     
    			if (reste != 0) {
    				for (int i = 3; i < p; i = i + 2) {
    					if (p % i == 0) {
    						verite = false;
    						// On s'arrete dès qu'on se rend compte que le nombre
    						// n'est pas premier
    						break;
    					}
    				}
    			} else {
    				verite = false;
    			}
     
    		}
    		return verite;
    	}
    Je ne l'ai pas testé (donc il peut y avoir des bourdes). Si tu ne comprends pas ce que j'ai changé n'hésites pas à me demander.

    EDIT : J'ai testé et corrigé le code il fonctionne

  4. #4
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Par défaut
    Merci, merci et merci.

    La seule chose qu' il me fallait, c' était comment parcourir que les nombres impairs.

    Maintenant, ça ira. J' aurai dû penser à i = i + 2.

    Merci encore

  5. #5
    Membre émérite
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Par défaut
    un petit résolu alors?

  6. #6
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    J'ai fait un autre code que Gailuris, je n'ai pas testé non plus:

    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
    public static boolean isPremier3(int p) {
        if(p == 1)
            return false;
        if(p == 2)
            return true;
        if(!(p % 2)) {
            return false;
        }
        else {
            for(int i = 2; i < p;  i++) {
                if(!(i % 2 == 0)) {// si i est impaire
                    if(p % i == 0)
                        return false;
                    }
            }
        }
        return true;
    }

    Quelques petits conseils,

    -ne créé pas de booleen sauf si tu en a une réelle utilité fait plutot un return true ou false qui évite de continuer les traitements--> plus optimisé

    -Comme gailuris l'a déjà dit évite les switch case dans un cas comme celui ci, tu n'as pas assez de possibilités, if ... else ... et beaucoup plus simple et lisible.

    -Une fonction récursive serait plus appropiée pour régler le problème des nombres premiers, (bizarre ton tp)

    voila a+

    Fk

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Par défaut
    Citation Envoyé par STB_Fk
    -ne créé pas de booleen sauf si tu en a une réelle utilité fait plutot un return true ou false qui évite de continuer les traitements--> plus optimisé
    C'est un peu philosophique, mais je ne suis pas trop d'accord, l'idéal pour moi, serait un while(...) qui fairait la meme chose que le for(...) et testerait aussi le booleen de retour : ainsi ça évite de faire du traitement pour rien et ça évite d'avoir plusieur return dans la meme méthode (un point d'entrée et un point de sortie).
    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            int i = 2;
            while(i < p && verite) {
                i = i + 2;
                // ...
            }
    Citation Envoyé par STB_Fk
    -Une fonction récursive serait plus appropiée pour régler le problème des nombres premiers, (bizarre ton tp)
    La c'est clair, mais je pense que ce tp a pour seul but de pratiquer avec des exemples simples (enfin j'éspère )


    PS. : Un petit serait approprié non ?

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    On peut s'arreter a (p/2) lorsqu'on recherche les diviseurs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 3; i <= (p/2); i = i + 2) { ... }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

+ 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