Private Function isPremier(ByVal n As Long) As Boolean Dim i As Long Dim racine2n As Long 'CAS DE BOARD If n = 0 Or n = 1 Then isPremier = False: Exit Function 'SI UN POYO MET UN NOMBRE NEGATIF If n < 0 Then n = n * -1 'ON FAIT LE TEST A CAUSE DU 2 'VU QUE LA BOUCLE FOR COMMENCE A 3 If n Mod 2 = 0 Then If n <> 2 Then isPremier = False Exit Function Else isPremier = True Exit Function End If End If 'LA RACINE CARREE DE N racine2n = Sqr(n) 'LA BOUCLE DE TESTS For i = 3 To racine2n Step 2 If n Mod i = 0 Then isPremier = False Exit Function End If Next i 'SI ON ARRIVE ICI C'EST QUE LE NOMBRE EST PREMIER (SAUF 2) isPremier = True End Function
Ah, enfin
En effet c'est bcp plus simple mais ça doit être plus court :Private Function isPremier(ByVal n As Long) As Boolean Dim i as Long If n = 1 or n = 0 Then Exit Function 'LA BOUCLE DE TESTS For i = 2 To int(Sqr(n))+1 If n Mod i = 0 Then Exit Function Next i isPremier = TrueEnd Function Enfin tout ça pour te demander pk avoir écrit plein de code autour ... comme 'SI UN POYO MET UN NOMBRE NEGATIF If n < 0 Then n = n * -1Au fait ... un boolean non initializé en vb prendra tj la valeur par défault False ... c'est bon à savoir non (Un integer ou Numérique prendra 0 et un String sera Empty) ?
Yo aKh, ça va ;)juste trois bricoles dans l'exemple du commentaire ci-dessus :if n = 1 or n = 0 : remplace par if n > -3 and n < 3 (ainsi les négatifs passent aussi)ajoute : if n mod 2 = 0 then exit function '(on sort si c'est pair)for i = 2 to .... > for i = 3 to int(sqr(n)+1) step 2 '(pour sauter les nombres pair)ainsi ça va 2 fois plus vite :) (quoique, trouver que 2147483647 est pair ne dure que 3,2ms avec l'algo aKh, optimisé on obtient 1,6ms, c'est un peu de l'enc... de drosophiles)et on peut diviser les nombres négatifs. en plus, faire n = n * -1 pour inverser le signe, c'est plus evident (et économe) de faire n = abs(n) .Pitié les gars, taper "Premier" dans la case "chercher" de vbfrance, y'a deja 20 sources là-dessus...
Pour tout le monde....Je crée pas cette source dans un but tech mais seulement pour eviter que tous les jours un mec nous postes ca sources isPremier avec 50 linges de code. Je sais qu'il y en a deja plein mais ceux que j'ai vu me font peur et je pense au mec qui comprend rien.Pour Proger :=========LOL le and en VB :p arff ! Sorry....2e chose le INT --> c'est en 16 bit en VB or les OS sont en 32 Bit le LONG et en 32 BIT le CPU calcul plus vite dans son propre nb de BIT.Assembleur oblige.Désolé pour ceux qui aurait Windope Serveur 64 Bits :ppour l'optimisation n=1 ou n=0Comme j'ai dit j'ai fait ca en 2min pour répondre a un autre qui avait posté une source avec des test en STING pour savoir si son nombre etait a virgule ou pas... donc j'ai pas regarde dans les details1.6 ms ? ummm ... je sais pas moi j'ai un disque de 1Ghz en RAM pure :p (Virutal disque) je suis sur le serveur :pdonc ca tourne a 0 aussi bien une que l'autrePour aKh :p========Le +1 sert a rien ca va encore faire gagné au moins 0.01 ms a Proger :pLe true et le false ca me vient du C. et moi faire un exit function sans fait isPremier = false c'est pas bon, c'est pas tres propreQuand au string a EMPTY et le numerique a 0 je trouve ca idiot et j'ai pas testémais je crois qu'en .Net c'est plus comme ca...Bhen immagine tu crée un tableau de 500 elementsen VB.netDIM tab[500] as integer //en plus en VB.nET c'est de 0 à 499 et non de 0à500 :pDIM ipour faire juste dessousfor i = 0 to 499 tab[i] = inext ivb6 va te faire un DIM tab[500] as integer //0 à 500 -- VB i = 0 for i = 0 to 500 tab(i) = 0 next i toi tu crées ton idim i -- vb i = 0for i = 0 to 500 tab(i) = inext iTu vois une optimisation TOI ?Ha moi pas....Voila sinon je vous conseil d'aller joue à Pacman ou a prophecy engine :pici ---> www.dreamersteam.org
?????un disk qui tourne en Ghz?????Ca me laisse perplex :D
Ya ques des sources sur les nombres premier ici :p:p:p. Bravo a tous les trois
Bouh t'aime pas mon And en VB ? bouhouhou... :(plus sérieusement, je n'ai jamais entendu dire que les opérations booléenne sont fastidieuse (en terme vitesse), surtout quand on compile son code vb en natif. c'est une fonction gravé en hard dans les cpu depuis le 4004 risc...Et vi, la différence entre un Dim i et un Dim i as long, c'est 3,7 ms pour trouver que 2147483647 est premier. Le seul moyen de dé partager la plétore de sources "nb premier" sur vbfrance, c'est bien la rapidité du code, alors toi aussi, enc... les drosophiles :)PS : 6Po, pour un chrono plus préçis que la milliseconde, va donc voir la catégorie "optimisation".mon 700MHz mets 1.460521 ms exactement (priorité process : real time) pour trouver que 2^31 - 1 est premier. Qui dit mieux? ah, pas tous en même temps svp ;)
Vbsupernulvivi c'est un RamDrive du serveur. Ca tourne a 1Ghz ca la rame du serveur fait du 1ghz :pJ'utilise ce pour le batch abominable :) Du style qui n'a pas payé sa facture de téléphone ce mois ci :pPour proger:IF ... and ... en VB c'est connu que c'est pas bon.fo préféré un IF .... THEN IF .... THEN END IF END IFen plus en VB = 0 faux et tout le reste = vrai :p donc quand tu va faire un test fo pas oublie de faire l'inverse... ca VB le fais tres bien mais ca prends tjs un peu de temps :pC'est pour ca que j'opte tjs pour le byte mais je voulais pas mettre un byte dans le source ci, sinon j'aurais eu plein de poste :pRicpperso=======ROLF :))) Alors pkoi tu les lis encore ?
(2 ^ 13 466 917) - 1 'Source :http://membres.lycos.fr/villemingerard/Premier/record.htm#L20Grandsest un nombre premier... Mais avec VB On peut toujours s'accrocher aux branches pour le trouver !!C'est quoi cet engouement pour les nombres premiers ??@+, VIC
il existe un algo bien plus rapide pour dire si le nombre et premier ou pas sans utiliser de boucle.
Que pensez vous de ma source :http://forum.vbfrance.com/article.aspx?Val=5164sur le sujet !
khaleid, c une cata ton truc...non seulement ça me met en rogne car tu utilise pas la fonction Mod et en plus tu utilises le And, ce que 6Po décrit comme "pas bon", et c'est vrai il a pas tord!ps : hé, 6Po, si t'en connais d'autres des bidouilles, je prends :)trouvaille du moment : do until...loop plus rapide que for...next
Voila un petit challenge:codé un programme qui trouve tous les nombre premier entre 0 et 10 000 000 le plus rapidement possible.indice: il y en a 664 579 mon programme le fait en 3 minutes 50 secondes sur un 1.2 Ghzbonne chance
Challenge relevé !Battu à plate couture !! avec mon pentium II 450 mhz, en 10 secondes !Mon algo est déposé à : http://www.vbfrance.com/codes/PI-X-__NOMBRE_DE_NOMBRES_PREMIERS_-ALGO_RAPIDE-/31126.aspx... et il y en a bien 664579... et ils sont tous stockés en mémoire...Mon challenge : TROUVER ENCORE PLUS RAPIDE !Bonne chance à tous...Amicalement,Us.
Se souvenir du profil
Mot de passe oublié ? / Activation de compteCréer un compte
1 625 013 membres 255 nouveaux aujourd'hui 15 516 membres club