Function FactGN(ByVal a As Long, Optional b As Variant = 2) As String 'CALCUL FACTORIELLE 'Traitement option : B=1er nb de départ b = CLng(b) 'Traitement des cas triviaux If a < 0 Then FactGN = "#VALEUR!": Exit Function If a = 0 Then FactGN = 1: Exit Function 'Variables Dim Base As Double, P As Double, Q As Double Dim N As Long, j As Long, i As Long Dim Expo As Long 'Base dynamique optimisée Expo = 15 - Len(Trim(Str$(a))) 'évite P>10^15 et donc le formattage exponentiel (1E15) !! 'Base de calcul Base = 10 ^ Expo 'Nombre d'indice dans la base N = Int((0.92 + (a + 0.5) * Log(a) - a) / Log(10)) + 1 'nb chiffre de A! N = Int(N / Expo) + 1 'Déclaration des indices ReDim t(N) As Double t(0) = 1 'Algorithme factorielle For j = b To a For i = 0 To N P = t(i) * j + Q Q = Int(P / Base) t(i) = P - Q * Base Next i Next j 'Rajoute les zeros devant les indices moins long que expo Dim Z As String 'optimisation string$ Z = "0" Dim ln10 As Double ln10 = Log(10) For i = N To 0 Step -1 FactGN = FactGN & String$(Expo - 1 - Fix(Log(t(i) + 0.11) / ln10), Z) & t(i) Next i 'Supprime les zeros inutiles du début FactGN = ZeroGN(FactGN) End Function