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 = True End 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 * -1 Au 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 :p pour l'optimisation n=1 ou n=0 Comme 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 details 1.6 ms ? ummm ... je sais pas moi j'ai un disque de 1Ghz en RAM pure :p (Virutal disque) je suis sur le serveur :p donc ca tourne a 0 aussi bien une que l'autre Pour aKh :p ======== Le +1 sert a rien ca va encore faire gagné au moins 0.01 ms a Proger :p Le 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 propre Quand 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 elements en VB.net DIM tab[500] as integer //en plus en VB.nET c'est de 0 à 499 et non de 0à500 :p DIM i pour faire juste dessous for i = 0 to 499 tab[i] = i next i vb6 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 i dim i -- vb i = 0 for i = 0 to 500 tab(i) = i next i Tu vois une optimisation TOI ? Ha moi pas.... Voila sinon je vous conseil d'aller joue à Pacman ou a prophecy engine :p ici ---> 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 ;)
Vbsupernul vivi c'est un RamDrive du serveur. Ca tourne a 1Ghz ca la rame du serveur fait du 1ghz :p J'utilise ce pour le batch abominable :) Du style qui n'a pas payé sa facture de téléphone ce mois ci :p Pour 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 IF en 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 :p C'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 :p Ricpperso ======= ROLF :))) Alors pkoi tu les lis encore ?
(2 ^ 13 466 917) - 1 'Source :http://membres.lycos.fr/villemingerard/Premier/record.htm#L20Grands est 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=5164 sur 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 Ghz bonne 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 873 496 membres 30 nouveaux aujourd'hui 16 151 membres club