Function EXPONENTIELLE(x As String, n As Long) As String
'x peut être un grand nombre entier sous forme de texte
EXPONENTIELLE = 1
For n = 1 To n
EXPONENTIELLE = APRODUIT(EXPONENTIELLE, x)
Next
End Function
Function ASOMME(x As String, y As String) As String
'x et y sont de grands nombres entiers sous forme de textes
Dim L%, n%, v&, ret%
L = Application.Max(Len(x), Len(y))
If L > 10000 Then ASOMME = -"" 'sécurité
x = String(9 + L - Len(x), "0") & x
y = String(9 + L - Len(y), "0") & y
For n = Len(x) To 10 Step -9
v = Val(Mid(x, n - 8, 9)) + Val(Mid(y, n - 8, 9)) + ret
ASOMME = Format(v Mod 1000000000, String(9, "0")) & ASOMME
ret = -(v > 999999999)
Next
For n = 1 To Len(ASOMME)
If Val(Mid(ASOMME, n, 1)) Then ASOMME = Mid(ASOMME, n): Exit Function
Next
End Function
For N = Len(x) To 10 Step -9
V = Val(Mid(x, N - 8, 9)) + Val(Mid(y, N - 8, 9)) + ret
ASOMME = Format(V Mod 1000000000, String(9, "0")) & ASOMME
ret = -(V > 999999999)
Next
x = String(18 + l - Len(x), "0") & x
y = String(18 + l - Len(y), "0") & y
Function ASOMME(x As String, y As String) As String
'x et y sont de grands nombres entiers sous forme de textes
Dim L%, n%, v&, ret%
L = Application.Max(Len(x), Len(y))
If L > 10000 Then End 'sécurité
x = String(9 + L - Len(x), "0") & x
y = String(9 + L - Len(y), "0") & y
For n = Len(x) To 9 Step -9
v = Val(Mid(x, n - 8, 9)) + Val(Mid(y, n - 8, 9)) + ret
ASOMME = Format(v Mod 1000000000, String(9, "0")) & ASOMME
ret = -(v > 999999999)
Next
For n = 1 To Len(ASOMME)
If Val(Mid(ASOMME, n, 1)) Then ASOMME = Mid(ASOMME, n): Exit Function
Next
End Function
(...)
Il faut descendre la boucle jusqu'à 9 (et pas 10) :
(...)
Function ASOMME$(x, y)
Dim i&, a$, b$, d&, r&, s$, tmp$
If Len(CStr(y)) > Len(CStr(x)) Then a = CStr(y): b = CStr(x) Else a = CStr(x): b = CStr(y)
d = 9 - (Len(a) Mod 9)
a = String(d, "0") & a
b = String(Len(a) - Len(b), "0") & b
For i = Len(a) To 9 Step -9
tmp = CStr(CLng(Mid$(a, i - 8, 9)) + CLng(Mid$(b, i - 8, 9)) + r)
Select Case Len(tmp)
Case 9: s = tmp & s: r = 0
Case Is > 9: s = Right$(tmp, 9) & s: r = 1
Case Else: s = Right$("00000000" & tmp, 9) & s: r& = 0
End Select
Next
ASOMME = Right$(s, Len(a) - d - (Mid$(s, Len(s) - Len(a) + d, 1) = "1"))
End Function
Function ASOMME$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim L%, n%, v$, ret&
If Len(x) > Len(y) Then L = Len(x) Else L = Len(y)
If L > 10000 Then End 'sécurité
x = String(9 + L - Len(x), "0") & x
y = String(9 + L - Len(y), "0") & y
For n = L + 1 To 1 Step -9
v = CStr(CLng(Mid(x, n, 9)) + CLng(Mid(y, n, 9)) + ret)
ASOMME = Right$("00000000" & v, 9) & ASOMME
ret = -(Len(v) > 9)
Next
For n = 1 To Len(ASOMME)
If CByte(Mid(ASOMME, n, 1)) Then ASOMME = Mid(ASOMME, n): Exit Function
Next
ASOMME = 0 'les 2 arguments sont nuls
End Function
Function APRODUIT$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim n%, t$, i As Byte
For n = Len(y) To 1 Step -1
t = ""
For i = 1 To CByte(Mid(y, n, 1))
t = ASOMME(x, t)
Next
APRODUIT = ASOMME(APRODUIT, t)
x = x & "0"
Next
End Function
(...)
L'ennui de votre solution Roger c'est qu'elle n'enlève pas les zéros non significatifs des arguments.
(...)
Personnellement, je nettoierais les arguments au début de la fonction pour ne pas trimballer des 0 inutiles tout le long des calculs.
Re,
Le nettoyage à la fin suffit car cela ne concerne que la 1ère exécution de ASOMME.
Pour les exécutions suivantes ils sont forcément propres.
A+
Function APRODUIT$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim n%, t$(9), z$
For n = 1 To 9
t(n) = ASOMME(t(n - 1), x)
Next
For n = Len(y) To 1 Step -1
APRODUIT = ASOMME(APRODUIT, t(CByte(Mid(y, n, 1))) & z)
z = z & "0"
Next
End Function