Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
DECOMPOSITION FACTEURS PREMIERS
Information sur la source
Description
"Un nombre premier est un entier naturel non-nul n'ayant que deux diviseurs : 1 et lui-même." Cette fonction vous permettra de décomposer un nombre en un produit de facteurs premiers. Exemples : FPremier(8) retourne 2^3 FPremier(35) retourne 5*7 FPremier(12) retourne 2^2*3 FPremier(7) retourne 7 (puisque 7 est un nombre premier) FPremier(0) et FPremier(1) ainsi que tous les nombres négatifs retournent "Error"
Source
- 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
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
Conclusion
Ce code est mon premier en Visual Basic, donc n'hésitez pas pour les conseils d'optimisation ;)
Historique
- 08 mai 2005 07:27:04 :
- - Petit détail réglé, merci us_30
- Code désormais commenté, j'espère que c'est clair :)
- 08 mai 2005 07:30:05 :
- - Alignement des commentaires...
Sources de la même categorie
Commentaires
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | | | |
|
|