Soyez le premier à donner votre avis sur cette source.
Vue 3 852 fois - Téléchargée 228 fois
'Vous devez creer : ' un TextBox : Text1 ' un commandbutton cmdFactoriser Dim div, nbr, nbrdiv As Long Dim Lst() As Long Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii < 48 And KeyAscii <> 8 Or KeyAscii > 57 Then KeyAscii = 0 End Sub Private Sub cmdFactoriser_Click() 'Initialisation : on rappelle que 1 n'est pas consideré comme un nombre premier ReDim Lst(0) nbr = Val(Text1.Text) div = 2 nbrdiv = 0 Text2.Text = "" If nbr < 2 Then MsgBox "Quel utilité de calculer ? " Text1.Locked = True cmdFactoriser.Enabled = False 'Le Caption du label3 sera toujours égale a "En Travail :" 'Un autre label ( le 4) indiquera à droite du label3 le nombre 'Ca évitera au pc d'avoir a rajouter a chaque fois "En travail :" Label3.Caption = "En travail : Test du diviseur :" While div <= Sqr(nbr) 'Rajouter Int() ralenti t'il le test ? Mais sans Int() le test s'effectue sur des nombre de type single... ce qui ralenti ) A voir ... Label4.Caption = div & " sur " & Int(Sqr(nbr)) 'Plusieurs possiblités : ' --> If nbr/div =int(nbr/div) Then ' --> If nbr mod div Then ' --> If nbr-(nbr\div)*div Then If nbr / div = Int(nbr / div) Then Lst(nbrdiv) = div nbrdiv = nbrdiv + 1 ReDim Preserve Lst(nbrdiv) nbr = nbr / div div = div - 1 ' si nbr multiple de 4 ? il faut retester "2" End If ' On enleve donc 1 ... div = div + 1 ' pour le rajouter la . resultat : aucun ( ou alors incremente ) DoEvents Wend If nbr Then For div = 0 To nbrdiv - 1 Text2 = Text2 & Lst(div) & " * " Next div Text2 = Text2 & nbr Else MsgBox " Votre nombre est premier !" End If Text1.Locked = False cmdFactoriser.Enabled = True Label3.Caption = "Factorisation terminée." End Sub
17 août 2005 à 20:29
si tu veux une méthode vraiment très rapide et vu que tu as l'air d'aimer les maths...tu devrais jetter un oeil sur les courbes elliptiques...je ne connais pas vraiment le principe mais ca permet de factoriser des nombres énormes très rapidement...
ShareVB
1 mai 2003 à 18:24
Je viens de vérifier quelquechose, et je ne comprend pas le conseil :
"Pour chaque nombre qui divise fait une boucle tant qu'il arrive à diviser
Do
Loop (While | Until)"
étant donné que c'est déja ce qu'il se passe !
Tapes 256 comme nombre et suis la lecture du programme ! Si tu regardes bien, lorsque div divise Nbr, une ligne de code enlève 1 à div. Ainsi lorsque la ligne de code qui suit le test de division est executé, div est incrémentée. Ainsi tout se passe comme s'il n'etait rien arrivé à div. Cela permet de refaire le test avec un nouveau Nbr mais avec un div inchangé (ici div =2)
Le code continue à tester 2 jusqu'à ce qu'il ne divise plus Nbr ou soit plus grand que ca racine carré.
-={[ ZeroCool ]}=-
29 avril 2003 à 12:14
Pour chaque nombre qui divise fait une boucle tant qu'il arrive à diviser
Do
Loop (While | Until)
Utilise une collection pour stocker tes valeurs (c'est moins casse bonbons à utiliser qu'un tableau redimensionnable)
Dès que tu trouves un diviseur, recalcule ta racine carrée et transforme le résultat en long (clng) pour le réutilisé lors des tests d'après.
Un petit truc logique, ton premier diviseur c'est 2, comme c'est le seul nombre pair premier tu peux faire ton pas de 2 en 2.
Comme c'est long de faire une division à virgule flottante préfère utiliser la fonction modulo et la division entière (antislash)
if nbr mod div = 0 Then
nbr = nbr \ div ' <-- plus rapide de très loin parce que tu évite 3 conversions
end if
bonne continuation
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.