Soyez le premier à donner votre avis sur cette source.
Snippet vu 5 324 fois - Téléchargée 38 fois
Public Function racine(nombre As String, reste As Boolean) If Len(nombre) Mod 2 = 1 Then nombre = "0" & nombre tmp3 = "0" For i = 1 To Len(nombre) Step 2 tmp1 = tmp3 & Mid$(nombre, i, 2) tmp2 = "0" tmp5 = multi(Mid$(racine, 1), "2") If i = 1 Then tmp4 = 0: tmp2 = Int(Sqr(tmp1)) ^ 2: a = Int(Sqr(tmp1)): tmp0 = tmp2: GoTo nott For a = 0 To 10 tmp0 = tmp2 If a < 10 Then tmp2 = multi(tmp5 & Mid$(a, 1), Mid$(a, 1)) If a = 10 Then tmp2 = multi(addition(multi(Mid$(tmp5, 1), "10"), Mid$(a, 1)), Mid$(a, 1)) tmp4 = pgdd(Mid$(tmp2, 1), Mid$(tmp1, 1)) If tmp4 = 0 Then Exit For If tmp4 = 1 Then Exit For Next a nott: tmp3 = soustraction(Mid$(tmp1, 1), Mid$(tmp0, 1)) racine = racine & Mid(a - tmp4, 1) Next i If reste = True Then racine = racine & "r" & tmp3 End Function Function addit(nombre As String) For i = 1 To Len(nombre) addit = addition(Mid$(addit, 1), Mid$(nombre, i, 1)) Next i End Function Public Function DecToBin(nombre As String) Do While nombre <> "0" bini = Val(Right(nombre, 1)) Mod 2 biny = bini & biny nombre = divis2(nombre) Loop DecToBin = biny End Function Public Function divis2(ByVal nombre As String) suiv = 0: div2 = "" For i = 1 To Len(nombre) div2 = div2 & Val(Mid(nombre, i, 1)) \ 2 + suiv suiv = (Val(Mid(nombre, i, 1)) Mod 2) * 5 Next i divis2 = zero(Mid$(div2, 1)) End Function
17 janv. 2005 à 08:17
La racine n'ayant pas été corrigée, je te propose une racine entière qui fonctionne sous VBA...
Private Function Racin(nombre As String)
Dim NbImp As String
Dim LeReste As String
Dim Sous As String
If Len(nombre) Mod 2 1 Then nombre "0" & nombre
NbImp = 1
LeReste = ""
For I = 1 To Len(nombre) Step 2
Tranche = Mid$(nombre, I, 2)
LeReste = LeReste & Tranche
Sous = "1"
Do
If Mid$(LeReste, 1, 1) <> "-" Then
LeReste = soustraction(Mid$(LeReste, 1), Mid$(NbImp, 1))
Else
LeReste = addition(Mid$(LeReste, 2), Mid$(NbImp, 1))
LeReste = "-" & LeReste
End If
NbImp = addition(Mid$(NbImp, 1), "2")
Sous = addition(Mid$(Sous, 1), "1")
cond = Mid$(LeReste, 1, 1)
Loop While cond <> "-" Or cond = "0"
Sous = soustraction(Sous, 2)
NbImp = soustraction(Mid$(NbImp, 1), "2")
If Left$(LeReste, 1) = "-" Then
LeReste = soustraction(Mid$(LeReste, 2), Mid$(NbImp, 1))
LeReste = Mid$(LeReste, 2)
Else
LeReste = addition(Mid$(LeReste, 1), Mid$(NbImp, 1))
End If
NbImp = soustraction(Mid$(NbImp, 1), "2")
NbImp = addition(multi(addition(Mid$(NbImp, 1), 1), 10), 1)
res = res & Sous
Next
Racin = zero(Mid$(res, 1))
End Function
15 janv. 2005 à 22:46
19 sept. 2004 à 18:38
9 août 2004 à 09:47
L'amélioration porte sur le typage, la lisibilité du code, les calculs préalables hors boucle.
L'intérêt du code étant de travailler sur des grands nombres et de l'utiliser à travers excel, une compilation sous C++ n'apporterait pas grand chose, si ce n'est de se traîner avec une DLL de plus.
Ce qui reste à creuser, c'est l'algorithme. Preuve en est sur Divis2(x) par rapport à Divis(x,2,faux)
Pour Racine(x) qui ne fonctionne pas, il faudrait réussir :
Puiss(x;0,5)
Mais ce code ne travaille pas avec les nombres à virgule.
Voire au delà de l'algorithme, ce qui reste à creuser c'est la connaissance des facteurs premiers de grands nombres, surtout quand il n'y en a que deux...
6 août 2004 à 23:32
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.