Soyez le premier à donner votre avis sur cette source.
Snippet vu 6 109 fois - Téléchargée 30 fois
Function FPremier(D As Long) As String 'On vérifie les cas, 1 et 0, ainsi que les nombres négatifs. Si c'est le cas on stoppe la fontion. If D <= 1 Then FPremier = D: Exit Function Dim A, X, I, N, L As Long, B As String, M, O As Integer 'Préparation du premier passage de la boucle : cette boucle va vérifier si notre nombre est multiple de A ou X ; on lui met donc les valeurs des 2 exceptions : 2 et 3. A = 2 X = 3 N = 9 O = 9 'Cette boucle sera effectuée 2 fois, une fois pour les cas 2 et 3, et une autre pour tous les facteurs de la forme 6t + 1 For M = 0 To 1 'Tant que A est inférieur ou égal a la racine carrée de N While A <= Sqr(N) 'On vérifie que D est bien un multiple de D ou X (D et X sont les nombres premiers qui seront testés, soit 2 et 3 lors du premier passage, ensuite ils seront redéfinis a 5 et 7 If D Mod A = 0 Or D Mod X = 0 Then 'On assigne le diviseur de D a la variable L L = IIf(D Mod A = 0, A, X) 'On calcule le nombre sous la forme D^I, ce qui évite d'avoir par exemple 8 = 2*2*2 While D Mod L = 0 I = I + 1 D = D / L Wend 'On ajoute le résultat à la suite de la variable B (si I est plus grand que 1, alors le nombre est écrit sous la forme D^I B = B & Chr(32) & L & IIf(I > 1, Chr(94) & Trim(I), "") 'On réinitialise la variable I. Au premier passage, on met N égal 9 (racine de 3...). Au 2nd passage, il prendra la valeur de D. I = 0 N = D * M + O Else 'Si le nombre n'est pas diviseur de A ou X, on ajoute 6 aux valeurs de A et X, ce qui stoppe la boucle au premier passage, et ce qui permet de la continuer au 2nd passage. A = A + 6 X = X + 6 End If Wend 'Le premier passage est terminé, on vérifiera désormais les valeurs 5 et 7, qui seront incrémentées de 6 a chaque fois, tous les nombres premiers sont donc vérifiés (11, 13, 17, 19, etc...) A = 5 X = 7 N = D O = 0 Next M 'On retourne le résultat en remplaçant les espaces par des étoiles. FPremier = Replace(Trim(IIf(D > 1, B & Chr(32) & Trim(D), B)), Chr(32), Chr(42)) End Function
...Enfin, maintenant pour moi, l'intérêt c'est de comprendre pourquoi ton algorithme est le plus rapide...
Bonne programmation....
Us.
Effectivement, le fonctionnement de ton code est a peu près similaire au mien, j'avais pas regardé ce code.
Je vais laisser quand même la fonction replace, plus claire a mon gout :)
Merci pour tes encouragements
MaX_62
Oui, maintenant j'ai bien saisi son fonctionnement... que je dois de qualifier d'asticieux... Bon, je dois aussi dire que votre algorithme est dans son principe parfaitement identique à celui que j'ai déposé (http://www.vbfrance.com/code.aspx?ID=31149)... Néanmoins, le votre est plus rapide dans certain cas particulier où l'on choisit un nombre premier trés grand... Ce qui m'étonne d'ailleurs... mais bon... c'est comme ça... (est-ce dû à l'emploi de While...Wend plutôt que Do...loop ?)
JE l'ai regardé de trés près, sans trouvé de défaut... J'ai juste remarqué la répétition : "D Mod A = 0" mais sans trouvé qlq chose de mieux...
{
Extrait :
If D Mod A 0 Or D Mod X 0 Then
'On assigne le diviseur de D a la variable L
L IIf(D Mod A 0, A, X)
}
IL me semble donc, trés bien... ET comme on dirait dans les chiffres et les lettres : PAS MIEUX !
Toute de même une p'tite remarque, (pour d'autres lecteurs)... Dans mon cas, je l'ai testé avec VBA dans Excel 97... et la fonction "Replace" n'existe pas... J'ai donc contourné le problème en modifiant les lignes :
B = B & Chr(32) & L & IIf(I > 1, Chr(94) & Trim(I), "")
en :
B = B & L & IIf(I > 1, "^" & Trim(I), "") & "*"
Puis,
FPremier = Replace(Trim(IIf(D > 1, B & Chr(32) & Trim
(D), B)), Chr(32), Chr(42))
en :
If Len(B) > 0 Then FPremier Left(B, Len(B) - 1) & IIf(D > 1, "*" & D, "") Else FPremier D
Voilà ! mes félicitations...
A+
Us.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.