J'ai un problème avec VBA Acces 2007, j'essaie de faire marcher cette fonction depuis des heures et je ne comprends pas ce que je pourrais modifier ??
' 5.9 : Les nombres premiers
Function DétermineNombrePremier(NB As Long) As Boolean
'Déclaration des variables
Dim vDiv
If DétermineNombrePremier < 4 Then
DétermineNombrePremier = True
Else
If DétermineNombrePremier = 0 Then
DétermineNombrePremier = False
Else
vDiv = 3
Do While (vDiv ^ 2 <= DétermineNombrePremier) And (DétermineNombrePremier Mod vDiv > 0)
vDiv = vDiv + 2
Loop
DétermineNombrePremier = (vDiv ^ 2 > DétermineNombrePremier)
End If
End If
End Function
Sub NombrePremier()
'Déclaration des variables
Dim vRep
Dim vNb As Long
Dim vTest As Variant
vTest = InputBox(Prompt:="Entrer un nombre", Title:="Nombre premier")
Do While vTest <> ""
If IsNumeric(vTest) Then
vNb = vTest
vRep = DétermineNombrePremier(vNb)
If vRep Then
MsgBox vNb & "est un nombre premier"
Else
MsgBox vNb & " n'est pas un nombre premier"
End If
Else
MsgBox "Vérifier votre saisie"
End If
vTest = InputBox(Prompt:="Entrer un nombre", Title:="Nombre premier")
Loop
MsgBox "Annulation de l'opération"
End Sub
Le problème est qu'il détermine à tous coups que le nombre entré est plus petit que quatre.
re, voici une petite démo avec le test de primarité de nos très lointains aîeux:
Function estnbreprem(nbre As Long) As Boolean
Dim cptr As Long
For cptr = 2 To nbre - 1
If nbre Mod cptr = 0 Then
estnbreprem = False
Exit Function
End If
Next
estnbreprem = True
End Function
testé avec 65537, nbre premier; mais ca pédale pas mal avec de plus grands nombre premiers comme 39916801
Remitch
Salut,
pour optimiser, pas besoin d'aller jusqu'à "nbre-1" :
il suffit de s'arrêter à int(sqrt (nbre))+1
Rémitch
Bryan
Voici mon petit teste de primarité si cela peut aider qqn;
Dim nbATester As Integer Dim c As Integer Dim div As Single Dim divEntier As Integer Dim nbdiv As Integer
nbATester = InputBox("Entrer le nombre à tester")
For c = 1 To nbATester div = nbATester / c divEntier = Int(div)
'Si les la division est égale à la int(division) 'Acrémentation d'un compteur. If div = divEntier Then nbdiv = nbdiv + 1 End If Next
'Si le compteur est égal à 2 ( donc si il y a 2 diviseur), c'est un nombre premier If nbdiv = 2 Then MsgBox (nbATester & " est premier") Else MsgBox (nbATester & " n'est pas premier") End If
testé avec 65537, nbre premier; mais ca pédale pas mal avec de plus grands nombre premiers comme 39916801
pour optimiser, pas besoin d'aller jusqu'à "nbre-1" :
il suffit de s'arrêter à int(sqrt (nbre))+1
Rémitch