Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Factorisation en Nombres premiers par récursivité

jm.andryszak

XLDnaute Occasionnel
J'ai un problème de point d'arrêt dans la fonction DecompositionRecursif
que je contourne par On Error GoTo err: 'Espace pile insuffisant (Erreur 28)
Cette solution ne me convient pas vraiment.
Quelqu'un aurait-il une solution ?
Merci
Voici le code

Option Explicit
'***********************************************
Dim Facteur
'***********************************************
Function DecompositionRecursif(n As Long, i) As String
'***********************************************
Dim j
Dim Result
'**********************************************
On Error GoTo err: 'Espace pile insuffisant (Erreur 28), Pb de point d'arrêt ??
'Point d'arrêt
If n = 1 Then
Result = Mid(Facteur, 1, Len(Facteur) - 3)
Debug.Print Result
Exit Function 'End
End If
'
j = 0
While n Mod i = 0
n = n / i
j = j + 1
Wend
If j <> 0 Then
Result = i & "^" & j & " * "
End If
Facteur = Facteur & Result

err:
'Espace pile insuffisant (Erreur 28), Pb de point d'arrêt ??
'Arrêt de la récursivité
If err.Number = 28 Then
Debug.Print Facteur & n & " " & EstPremier(n)
Exit Function 'End
'Récursité
Else
DecompositionRecursif = DecompositionRecursif(n, i + 1)
End If
End Function
'***********************************************
Sub Test_DecompositionRecursif()
'***********************************************
Dim Nombre As Long
Dim Debut
'***********************************************
'Nombre = 7 * 5000000
'Nombre = 9
'Nombre = 13 * 2 * 997
'Nombre = 461 * 499987
Nombre = 3 * (152311 + 3 ^ 1 * 19 ^ 1 * 89 ^ 1 * 1607)
Debug.Print Nombre
Facteur = ""
Debut = Timer
DecompositionRecursif Nombre, 2
Debug.Print "fin " & Timer - Debut
End Sub
'***********************************************
 

jm.andryszak

XLDnaute Occasionnel
Merci beaucoup
j'ai testé la fonction D, un peu lent pour un nombre comme
24913866 (2*3*4152311) mais là n'est pas la question.
La nuit portant conseil j'ai trouvé mon oubli, il manquait un autre point d'arrêt à la récursivité.
J'ai modifié comme ceci et ça fonctionne.
(la fonction EstPremier comme son nom l'indique vérifie si n est premier)

'Premier point d'arrêt
If n = 1 Then
Result = Mid(Facteur, 1, Len(Facteur) - 3)
Debug.Print Result
Exit Function 'End

'Deuxième Point d'arrêt, plus d'erreur Espace pile insuffisant (Erreur 28)
ElseIf EstPremier(n) Then
Debug.Print Facteur & n
Exit Function 'End
End If
temps d'exécution : 0,0098 sec.

Merci encore A+
 

Discussions similaires

Réponses
12
Affichages
613
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…