Pourquoi 15 est premier ?

Pourquoi 15 est premier ? - Java - Programmation

Marsh Posté le 07-10-2002 à 20:16:41    

Code :
  1. public static boolean premier(int p)
  2. {
  3. int i;
  4. boolean b=false;
  5. i=(p-1);
  6. while(i>1)
  7.  {
  8.  if((p%i)==0)
  9.   {
  10.   b=false;
  11.   }
  12.  else
  13.   {
  14.   b=true;
  15.   }
  16.  i=i-1;
  17.  }
  18.  return b;
  19. }


 
 :cry:  pk ?  :cry:  
 
15%5=0 alors pk y me sort :
 

Code :
  1. c:\Java\jdk1.1.8\bin>java Premier
  2. a : 15
  3. Premier : true

Reply

Marsh Posté le 07-10-2002 à 20:16:41   

Reply

Marsh Posté le 07-10-2002 à 20:26:09    

paske tu t'arretes pas quand tu as trouve un diviseur
et tu peux t'arreter a p/2 pour la recherche des diviseurs, c suffisant

Reply

Marsh Posté le 07-10-2002 à 20:34:48    

Ben fo faire le suivi de variable.
p = 15
i = 14
 
Boucle :
1er passage : b = true (p%i = 1) i=13
2ème passage : b = true (p%i = 2) i=12
3            : b = true (p%i = 3) i=11
4            : b = true (p%i = 4) i=10
5            : b = false i=9
....
(i=5)             : b = false i=4
...
i=2               : b = true (p%i=1) i=1
 
Fin de la boucle car si i=1 alors i n'est pas strictement sup à 1
 
Donc ça renvoie true.
A mon avis ta échangé false et true


Message édité par Je@nb le 07-10-2002 à 20:35:13
Reply

Marsh Posté le 07-10-2002 à 20:38:40    

c exact
 
l'algo correct serait
 
pour i=2 jusqu'a p/2 repeter
si p%i==0 alors
renvoyer faux
fin si
fin pour
renvoyer vrai

Reply

Marsh Posté le 07-10-2002 à 20:40:05    

Code :
  1. i=(p-1);
  2. while(i>1 && i>(p/2))
  3.  {
  4.  if((p%i)==0)
  5.   {
  6.   b=false;
  7.   i=0;
  8.   }
  9.  else
  10.   {
  11.   b=true;
  12.   }
  13.  i=i-1;
  14.  }
  15.  return b;
  16. }


 
sans le i>(p/2) ca marche et avec le i>(p/2)) 15 ets denouvo premier  :cry:

Reply

Marsh Posté le 07-10-2002 à 20:42:50    

euh ... pour s'arreter a p/2 faut commencer dans l'autre sens ;)
 
tu commences a 2 et tu t'arretes a p/2

Reply

Marsh Posté le 07-10-2002 à 20:46:54    

Code :
  1. i=2;
  2. while(i>(p/2))
  3.  {
  4.  if((p%i)==0)
  5.   {
  6.   b=false;
  7.   i=0;
  8.   }
  9.  else
  10.   {
  11.   b=true;
  12.   }
  13.  i=i+1;
  14.  }
  15.  return b;
  16. }


 
11 est pu premier  :cry:

Reply

Marsh Posté le 07-10-2002 à 20:49:50    

Code :
  1. i=2;
  2. b=true;
  3. while(i<(p/2) && b)
  4. {
  5.  if((p%i)==0)
  6.  {
  7.   b=false;
  8.  }
  9.  else
  10.  {
  11.   i--;
  12.  }
  13. }
  14. return b;

Reply

Marsh Posté le 07-10-2002 à 20:53:08    

Code :
  1. for(i=2; i<(p/2); --i)
  2. {
  3.   if(p%i ==0)
  4.      return false;
  5. }
  6. return false;


 
 
mais il me semble qu'on peut meme s'arreter à sqrt(p)


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 07-10-2002 à 20:54:48    

Taz@PPC a écrit a écrit :

Code :
  1. for(i=2; i<(p/2); --i)
  2. {
  3.   if(p%i ==0)
  4.      return false;
  5. }
  6. return true;


 
 
mais il me semble qu'on peut meme s'arreter à sqrt(p)




 
ca je sais pas ... p/2 c sur
et renvoyer vrai c mieux  ;)


Message édité par HappyHarry le 07-10-2002 à 20:57:45
Reply

Marsh Posté le 07-10-2002 à 20:54:48   

Reply

Marsh Posté le 07-10-2002 à 20:56:09    

ok
merci

Reply

Marsh Posté le 07-10-2002 à 21:25:32    

EpoK a écrit a écrit :

ok
merci




 
On peut s'arreter a sqrt(p), c'est certain.

Reply

Marsh Posté le 08-10-2002 à 08:56:07    

Pis bon, on peut aussi un tantinet améliorer les choses, en commençant par vérifier si par hasard le nombre est pas pair, et ensuite en ne prenant en compte que les diviseurs impairs, pasque bon.....
 
Enfin, en temps de calcul, s'arrêter à sqrt(p), je sais pas si c'est une bonne solution : le calcul de sqrt prendra sans doute plus de temps que la vérification un peu astucieuse jusqu'à p/2, non???


Message édité par gfive le 08-10-2002 à 09:02:06
Reply

Marsh Posté le 08-10-2002 à 09:03:41    

même à racine de P pour s'arreter...
perso, pour les nb premiers, je préfère largement le crible d'Eratostène ! bcp plus rapide !


---------------
Tout cul tendu mérite son dû
Reply

Marsh Posté le 08-10-2002 à 09:18:37    

excellent le titre du topic [:ddr555]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-10-2002 à 10:04:39    

Il serait préférable d'écrire ceci à la place de ce que tu as posté en haut de ce topic (plus lisible) :

Code :
  1. public static boolean premier(int p) {
  2.   boolean  b = false;
  3.   int      i = p - 1;
  4.   while (i > 1) {
  5.     b = ((p % i) != 0);
  6.     i--; 
  7.   }
  8.   return b;
  9. }


 
Plusieurs remarques :

  • Effectivement, il y a un bug : d'après le code, b est à true si p a un diviseur. Dommage...
  • C'est un peu bête de ne pas s'arrêter dès qu'on sait que le nombre n'est pas premier.


Si maintenant on tient compte des remarques (judicieuses) qui t'ont été faites par les autres forumeurs, plus quelques tests aux limites supplémentaires, cela donne :

Code :
  1. public static boolean premier(int p) {
  2.   if (p <= 1) {
  3.     return false;
  4.   }
  5.   if ((p % 2) == 0) {
  6.     return (p == 2);
  7.   }
  8.   int  max = p / 2;
  9.   int  i   = 3;
  10.   while (i < max) {
  11.     if ((p % i) != 0) {
  12.       return false;
  13.     }
  14.     i += 2;
  15.   }
  16.   return true;
  17. }


Message édité par BifaceMcLeOD le 08-10-2002 à 10:04:50
Reply

Marsh Posté le 08-10-2002 à 10:32:35    

EpoK a écrit a écrit :

Code :
  1. public static boolean premier(int p)
  2. {
  3. int i;
  4. boolean b=false;
  5. i=(p-1);
  6. while(i>1)
  7.  {
  8.  if((p%i)==0)
  9.   {
  10.   b=false;
  11.   }
  12.  else
  13.   {
  14.   b=true;
  15.   }
  16.  i=i-1;
  17.  }
  18.  return b;
  19. }






beurk. elle est pas belle ton indentation : c'est moche de metter les '{' à la ligne ! :(

Reply

Marsh Posté le 08-10-2002 à 10:48:11    

rabat-joie  :kaola:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-10-2002 à 10:50:18    

DarkLord a écrit a écrit :

rabat-joie  :kaola:  




j'aime pas le parenthèsage qui mutiplie la longueur du code par 2  :o

Reply

Marsh Posté le 08-10-2002 à 13:15:16    

benou a écrit a écrit :

 
j'aime pas le parenthèsage qui mutiplie la longueur du code par 2  :o  



idem, je suis aussi d'accord... ça devient illisible si faut tout faire défiler pour 3 malheureuses lignes de code !


---------------
Tout cul tendu mérite son dû
Reply

Marsh Posté le 08-10-2002 à 13:18:39    

benou a écrit a écrit :

 
j'aime pas le parenthèsage qui mutiplie la longueur du code par 2  :o  




 
j'ose ? j'ose pas ? j'ose ? j'ose pas ?
allez, j'ose : PYTHON ROXOR

Reply

Marsh Posté le 08-10-2002 à 17:59:20    

benou a écrit a écrit :

 
beurk. elle est pas belle ton indentation : c'est moche de metter les '{' à la ligne ! :(




 
Arrete! C'est beaucoup plus lisible au contraire!
Chaque accolade est alignée avec son homologue!

Reply

Marsh Posté le 08-10-2002 à 20:23:47    

Moi, c'est comme ça que je fais (ce qui n'est pas une référence  :lol:). Je trouve ça lisible d'une façon limpide.
 
En QuickBasic, on fait aussi comme ça . :D  
 
Y en a qui préfèrent if () {
                     ....
                     }
Chacun sa méthode. :ange:

Reply

Marsh Posté le 08-10-2002 à 20:28:55    

le fameux troll de l'accolade ouvrante. c'est en rien typique d'un langage de programamtion, c'est juste un style.
 
et si zetes pas contents, faites du Python  :sol:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 08-10-2002 à 20:31:07    

Taz@PPC a écrit a écrit :

 
et si zetes pas contents, faites du Python  :sol:  




ca a quoi de particulier?

Reply

Marsh Posté le 08-10-2002 à 20:33:35    

c'est l'indentation qui définit les bloc et pas des {} ou des begin/end. y a pas de ; non plus
 

Code :
  1. def fibonacci(terme_max):
  2.     if(terme_max<0):
  3.         return []
  4.     elif(terme_max==0):
  5.         return [0]
  6.     elif(terme_max==1):
  7.         return [0, 1]
  8.     else:
  9.         terme_NM2, terme_NM1 = 0, 1
  10.         fibo=[0]
  11.         for i in range(1, terme_max) :
  12.             fibo.append(terme_NM1)
  13.             terme_NM2, terme_NM1 = terme_NM1, terme_NM1+terme_NM2
  14.         return fibo
  15. print """Suite de Fibonacci : jusqu'à quel terme voulez vous calculer ?"""
  16. i_terme=int(raw_input('Entrez un entier positif : '))
  17. print fibonacci(i_terme)


Message édité par Taz@PPC le 08-10-2002 à 20:34:53

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 08-10-2002 à 21:45:25    

On laissera aux spécialistes. :)

Reply

Marsh Posté le 08-10-2002 à 22:24:36    

c pas pour le code (simple cependant), juste pour vous montrer que l'indentation suffit sommes toutes


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 08-10-2002 à 22:45:36    

Taz@PPC a écrit a écrit :

le fameux troll de l'accolade ouvrante. c'est en rien typique d'un langage de programamtion, c'est juste un style.
 
et si zetes pas contents, faites du Python  :sol:  




 
C'est une question de convention pas de "style"...  
 
Maintenant libre a chacun d'adopter les conventions qui lui plaisent (du moment qu'il travaille avec des gens qui adoptent les memes conventions que lui bien sur... sinon tout le monde pete un plomb)
 
Au passage, l'accolade a la ligne est une convention C++, tout comme l'est la nomination des variables par "m_variable" ;)

Reply

Marsh Posté le 09-10-2002 à 23:03:25    

y a quand même une suptilité : y a une des 2 méthode qui est la convention de codage java et pas l'autre : http://java.sun.com/docs/codeconv/ [...] 0.html#182
 
 :kaola:

Reply

Marsh Posté le 10-10-2002 à 10:12:57    

Les conventions de codage recommandées par Sun ne sont pas un hasard : d'après les nombreuses études qui ont été menées sur le sujet depuis pas mal d'années, ce sont celles qui sont les plus efficaces pour faire appréhender au lecteur la structure du code d'un seul coup d'oeil, puis faciliter la lecture et la compréhension de ce code.
 
En particulier, pour revenir au sujet de la position de l'accolade ouvrante, c'est la structure de bloc abstrait qui semble la plus efficace pour comprendre le plus rapidement possible la structure de contrôle (début, fin, condition d'arrêt) :

while ####### begin
    ########
    ########
end
 
for ####### begin
    ########
    ########
end
 
 
if ####### then
    ########
    ########
else
    ########
    ########
end
 
function ####### begin
    ########
    ########
end


Message édité par BifaceMcLeOD le 10-10-2002 à 10:16:20
Reply

Marsh Posté le 10-10-2002 à 10:38:28    

benou a écrit a écrit :

y a quand même une suptilité : y a une des 2 méthode qui est la convention de codage java et pas l'autre : http://java.sun.com/docs/codeconv/ [...] 0.html#182
 
 :kaola:  




 
;)

Reply

Marsh Posté le 11-10-2002 à 04:18:09    

"i divise p et i > racine de p
ssi p/i divise p et p/i < racine de p"
cqfd
donc tu peux t'arreter a racine de p (inclus of course)
 
LeGreg

Reply

Marsh Posté le 11-10-2002 à 09:27:36    

legreg a écrit a écrit :

"i divise p et i > racine de p
ssi p/i divise p et p/i < racine de p"
cqfd
donc tu peux t'arreter a racine de p (inclus of course)
 
LeGreg




 
Utilisation abusive de cqfd... qu'as tu demontre ? rien !
 
:lol:
 
(je sais je chipotte)

Reply

Marsh Posté le 11-10-2002 à 19:01:47    

j'ai demontre qu'on pouvait s'arreter a la racine de p
 
qu'est-ce que j'y peux si la demonstration tient
en une ligne??
 
LeGreg

Reply

Marsh Posté le 12-10-2002 à 02:10:09    

ben dans ce cas le cqfd est une ligne trop haut, mais bon, on s'en fout :D

Reply

Marsh Posté le 12-10-2002 à 10:43:39    

lorill a écrit a écrit :

ben dans ce cas le cqfd est une ligne trop haut, mais bon, on s'en fout :D  




ben dites donc... vous avez pas l'air d'aimer les démonstrations vous :)

Reply

Marsh Posté le 07-11-2002 à 17:44:22    

EpoK a écrit a écrit :

Code :
  1. public static boolean premier(int p)
  2. {
  3. int i;
  4. boolean b=false;
  5. i=(p-1);
  6. while(i>1)
  7.  {
  8.  if((p%i)==0)
  9.   {
  10.   b=false;
  11.   }
  12.  else
  13.   {
  14.   b=true;
  15.   }
  16.  i=i-1;
  17.  }
  18.  return b;
  19. }


 
 :cry:  pk ?  :cry:  
 
15%5=0 alors pk y me sort :
 

Code :
  1. c:\Java\jdk1.1.8\bin>java Premier
  2. a : 15
  3. Premier : true






Initialise b a true
et ajoute la condition b == true dans ton while
Parcequ'une fois qu'il est pas premier, il est pas premier !!!

Reply

Marsh Posté le 07-11-2002 à 17:48:44    

ouh le déterrage de topic !!!
 
(surtout ceux ou on avait deja donné la solution ;) )

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed