VBA problème avec fonction nombre premier

Filipensky Messages postés 46 Statut Membre -  
 Bryan -
Bonjour,

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.

1 réponse

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    tu écris
    If DétermineNombrePremier < 4 Then
    DétermineNombrePremier = True

    Déterminenombrepremioer est un booléen toujours égal au départ à faux donc à 4 ( puisqu'à la rigueur faux*1=0...)

    de m^me
    Do While (vDiv ^ 2 <= DétermineNombrePremier) me parait bien mystérieux...

    Michel
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
      0
    2. Remitch
       
      Salut,

      pour optimiser, pas besoin d'aller jusqu'à "nbre-1" :
      il suffit de s'arrêter à int(sqrt (nbre))+1

      Rémitch
      0
    3. 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
      0