MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 2005
-
8 mars 2005 à 20:42
MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 2005
-
9 mars 2005 à 22:44
var
i: Integer;
Temp: Integer;
begin
Randomize;
Temp:= Random(10)+Random(10)*10+Random(10)*100+Random(10)*1000+Random(10)*10000;
for i:= 2 to Round(Power(Temp,0.5)) do
begin
if Temp mod i<>0
then ButtonGenererClick(Sender); // <============== ici
end;
EditClePublique.Text:=IntToStr(Temp);
salut, jessaie de generer un nombre premier, seulement ca plante
apparement une erreur de stackoverflow ou quelque chose comme ca...
peut etre que ca vient de l appel a elle meme (la procedure) si le nombre n est pas premier...
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008 8 mars 2005 à 22:48
Faut que tu trouve un nombre premier au hasard c ça ?
Sinon je croit voir d'ou viend ton probleme :
Je suppose que ce code est dans la procedure ButtonGenererClick et que si ton nombre n'est pas premier tu la relance ?
Si c'est le cas ya deux gros problemes :
- Deja tu teste si i divise ton nombre. Si NON ok on passe au suivant. Si OUI on relance une procedure ButtonGenererClick : mais la tu devrai deja faire un break pour pas tester les si les nombre après i divisent temp puiske t'en a trouvé un.
- Ensuite ce qui fait planté c'est le fait que tu fait un appel a ButtonGenererClick. Dans cette méthode si tu trouve pas de nombre premier, tu réapelle ButtonGenereClick, alors que la procedure n'est meme pas achevé, ce qui force le pc a mémoriser le fait que y'a une procedure ButtonGenererClick qui est démarrée et qu'il faudra la finir... On appele ça une fonction récursive puisque qu'elle sappelle elle-meme... Le prob c'est que a force de pas trouver de nombre premier il continu d'appeler cette procedure sans la finir, donc le pc doit memoriser de plus en plus pour savoir ou il en est, et au bou d'un moment ça sature...
Les info sur ou en est le programme dans les procedure on appelle ça la pile (stack), et la tu en demande trop donc dépassement (overflow).
Je sais pas si tu va comprendre ce que je te dit mais c dur a expliquer lol...
Ce qu'il faudrai plutot que tu fasse c'est un truc du genre :
TANT QUE on a pas trouvé de nombre premier FAIRE
BEGIN
Generer un nombre premier;
tester les diviseur et si on en trouve pas on dit que on a trouvé un nombre premier
END
MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 20051 9 mars 2005 à 22:42
voila, j ai reussi !!
[code]
var
i, Temp, Reste: Integer;
begin
Randomize;
repeat
Temp:= Random(10)*100+Random(10)*10+Random(10);
for i:=2 to Floor(Sqrt(Temp)) do
begin
Reste:= Temp mod i;
if Reste=0 then Break;
if i= Floor(Sqrt(Temp)) then EditClePublique.Text:= IntToStr(Temp);
end;
until EditClePublique.Text<>'';
[\code]
j ai donc evite la recursivite... (cest plus facile)
sovitec
Messages postés47Date d'inscriptionmardi 18 mai 2004StatutMembreDernière intervention24 juillet 2006 9 mars 2005 à 09:15
Plusieurs remarques :
1) Pourquoi ne pas écrire Temp := random(100000) ?
2) Il existe une fonction sqrt plus rapide que power(x, 0.5)
3) Tu peux gagner un peu en utilisant Floor plutôt que round
4) Ton test est très lent et devient rédhibitoire pour les grands
nombres. Tu pourrais au moins utiliser le crible d'Erasthotène. Si tu
veux passer à de très grands nombre il faudra envisager des méthodes
telles que Miller-Rabin.
Le reste des problèmes a été soulevé par neodelphi, mais tu n'en donnes
pas assez pour que l'on comprenne exactement d'où vient ton plantage.
Vous n’avez pas trouvé la réponse que vous recherchez ?
MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 20051 9 mars 2005 à 18:50
merci pour toutes vos reponses, j ai bien compris ce que vous m avez dit. par contre, j en ai donne suffisament je pense pour que vous voyez d ou vient le bug puisque cest tout ce qu il y a dans mon code pour l instant.
et le bug vient bien du probleme de saturation de la pile...
merci encore pour les fonctions sqrt et floor.
tandis que le temp:= random(.... cest parce que j ai recuperer un truc que j avais deja fait mais dans un autre but.... j ai meme pas penser a corriger ca.
MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 20051 9 mars 2005 à 19:06
apres reflexion si j ai pas change le random, cest parce que je veux que mon nombre ait un certain nombre de caracteres !! sinon je peux me retrouver avec un nombre a deux chiffres !
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008 9 mars 2005 à 19:59
"Tu pourrais au moins utiliser le crible d'Erasthotène"
Mais je croit que ce qu'il veut c'est générer un nombre premier aléatoire... dans ce cas faudrait faire le crible des nombre premiers jusqu'à 10000 et les stocker mais yen a ptete un peu trop... ou alors se fixer un nombre au hasard n := Random(10000) puis d'appliquer un crible d'eratostene et de prendre le premier nombre premier supérieur à n.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 9 mars 2005 à 22:26
Ne vous laissez pas abuser par le titre de ce topic : "generer un nombre premier".
Le problème de MoveX provient en réalité d'une non maîtrise de l'utilisation de la récursivité comme l'a expliqué (et compris tout de suite ) NeoDelphi.
MoveX doit revoir son code d'après les recommandations de NeoDelphi et valider sa réponse, rien de plus.
Les problèmes de débordement de pile sont le risque premier de la récursivité .