OVH Cloud OVH Cloud

If If If If

10 réponses
Avatar
garnote
Bonjour à tous et à toutes,

Cette fonction personnalisée permet de savoir si
un nombre est premier ou pas.
a) Comment faire, sans trop de If (!), pour que premier = ???
quand nombre est autre chose que :
2, 3, 4, 5, 6, 7, 8, 9, ...
b) À moins qu'il existe une fonction IsPrime !

Function premier(nombre As Range) As String
If nombre = 2 Then
premier = "Oui"
Exit Function
Else
For i = 2 To Sqr(nombre) + 1
If nombre Mod i = 0 Then
premier = "Non"
Exit Function
End If
Next i
End If
premier = "Oui"
End Function

Serge

10 réponses

Avatar
Radix??
Bonjour,

J'ai peut être pas tout compris mais en général il est possible de remplacer
des IF IF IF par du
"select case"
"case else"
"end select".....

Radix,

"garnote" a écrit dans le message de
news:
Bonjour à tous et à toutes,

Cette fonction personnalisée permet de savoir si
un nombre est premier ou pas.
a) Comment faire, sans trop de If (!), pour que premier = ???
quand nombre est autre chose que :
2, 3, 4, 5, 6, 7, 8, 9, ...
b) À moins qu'il existe une fonction IsPrime !

Function premier(nombre As Range) As String
If nombre = 2 Then
premier = "Oui"
Exit Function
Else
For i = 2 To Sqr(nombre) + 1
If nombre Mod i = 0 Then
premier = "Non"
Exit Function
End If
Next i
End If
premier = "Oui"
End Function

Serge




Avatar
Michel Pierron
Bonjour garnote;

Function IsPrime(lNum&) As Boolean
Dim i&: lNum = Abs(lNum)
For i = 2 To lNum - 1
If IsFactor(lNum, i) Then Exit Function
Next
IsPrime = True
End Function

Function IsFactor(lNum&, lFactor&) As Boolean
IsFactor = Not CBool(lNum Mod lFactor)
End Function

MP

"garnote" a écrit dans le message de news:

Bonjour à tous et à toutes,

Cette fonction personnalisée permet de savoir si
un nombre est premier ou pas.
a) Comment faire, sans trop de If (!), pour que premier = ???
quand nombre est autre chose que :
2, 3, 4, 5, 6, 7, 8, 9, ...
b) À moins qu'il existe une fonction IsPrime !

Function premier(nombre As Range) As String
If nombre = 2 Then
premier = "Oui"
Exit Function
Else
For i = 2 To Sqr(nombre) + 1
If nombre Mod i = 0 Then
premier = "Non"
Exit Function
End If
Next i
End If
premier = "Oui"
End Function

Serge




Avatar
garnote
Salut Michel,

Vais tenter de comprendre ce va-et-vient ;-)

Merci et A+

Serge



"Michel Pierron" a écrit dans le message de news:

Bonjour garnote;

Function IsPrime(lNum&) As Boolean
Dim i&: lNum = Abs(lNum)
For i = 2 To lNum - 1
If IsFactor(lNum, i) Then Exit Function
Next
IsPrime = True
End Function

Function IsFactor(lNum&, lFactor&) As Boolean
IsFactor = Not CBool(lNum Mod lFactor)
End Function

MP

"garnote" a écrit dans le message de news:

Bonjour à tous et à toutes,

Cette fonction personnalisée permet de savoir si
un nombre est premier ou pas.
a) Comment faire, sans trop de If (!), pour que premier = ???
quand nombre est autre chose que :
2, 3, 4, 5, 6, 7, 8, 9, ...
b) À moins qu'il existe une fonction IsPrime !

Function premier(nombre As Range) As String
If nombre = 2 Then
premier = "Oui"
Exit Function
Else
For i = 2 To Sqr(nombre) + 1
If nombre Mod i = 0 Then
premier = "Non"
Exit Function
End If
Next i
End If
premier = "Oui"
End Function

Serge








Avatar
Michel Pierron
Re garnote;
Peut être plus simple:

Function IsPrime(Number&) As Boolean
If Number Mod 2 = 0 Then Exit Function
Dim Result&: Result = Number
Dim n&: n = 3
Do While Result > n
If Number Mod n = 0 Then Exit Function
Result = Number / n
n = n + 2
Loop
IsPrime = True
End Function

MP

"garnote" a écrit dans le message de news:

Bonjour à tous et à toutes,

Cette fonction personnalisée permet de savoir si
un nombre est premier ou pas.
a) Comment faire, sans trop de If (!), pour que premier = ???
quand nombre est autre chose que :
2, 3, 4, 5, 6, 7, 8, 9, ...
b) À moins qu'il existe une fonction IsPrime !

Function premier(nombre As Range) As String
If nombre = 2 Then
premier = "Oui"
Exit Function
Else
For i = 2 To Sqr(nombre) + 1
If nombre Mod i = 0 Then
premier = "Non"
Exit Function
End If
Next i
End If
premier = "Oui"
End Function

Serge




Avatar
garnote
Salut Michel,

Astucieux de ne prendre que les diviseurs impairs.
Et j'ai appris que Exit Function est
l'équivalent de IsPrime = False.
J'ai ajouté quelques fioritures et utilisé ta
fonction pour faire une liste des 10 000
premiers nombres premiers.

A+

Serge

Function IsPrime(Number&) As Boolean
'Il faut que Number soit un entier >=1
'Le plus grand nombre premier détecté
'par cette fonction: 2 147 483 647.
'Le nombre premier suivant est
'2 147 483 659. Il génère une erreur.
If Number = 2 Or Number = 3 Then
IsPrime = True
Exit Function
End If
If Number Mod 2 = 0 Or Number = 1 Then Exit Function
Dim Result&: Result = Number
Dim n&: n = 3
Do While Result > n
If Number Mod n = 0 Then Exit Function
Result = Number / n
n = n + 2
Loop
IsPrime = True
End Function

Sub Liste()
'Liste des 10 000 premiers nombres premiers
Dim L(1 To 10000, 1 To 2) As Long
Dim n&
L(1, 1) = 1: L(1, 2) = 2
L(2, 1) = 2: L(2, 2) = 3
i = 2: n = 3
Do Until i = 10000
n = n + 1
If IsPrime(n) Then
i = i + 1
L(i, 1) = i: L(i, 2) = n
End If
Loop
[A1:B10000] = L
End Sub



"Michel Pierron" a écrit dans le message de news:

Re garnote;
Peut être plus simple:

Function IsPrime(Number&) As Boolean
If Number Mod 2 = 0 Then Exit Function
Dim Result&: Result = Number
Dim n&: n = 3
Do While Result > n
If Number Mod n = 0 Then Exit Function
Result = Number / n
n = n + 2
Loop
IsPrime = True
End Function

MP

"garnote" a écrit dans le message de news:

Bonjour à tous et à toutes,

Cette fonction personnalisée permet de savoir si
un nombre est premier ou pas.
a) Comment faire, sans trop de If (!), pour que premier = ???
quand nombre est autre chose que :
2, 3, 4, 5, 6, 7, 8, 9, ...
b) À moins qu'il existe une fonction IsPrime !

Function premier(nombre As Range) As String
If nombre = 2 Then
premier = "Oui"
Exit Function
Else
For i = 2 To Sqr(nombre) + 1
If nombre Mod i = 0 Then
premier = "Non"
Exit Function
End If
Next i
End If
premier = "Oui"
End Function

Serge








Avatar
Michel Pierron
Re garnote;

Gaffum; dans ce cas précis, Exit Function implique que la fonction retourne
False parce qu'il s'agit d'une fonction boléenne et qu'en VB, par défaut à
l'exécution, toutes les variables non initialisées par code sont
initialisées à 0, "" ou False en fonction de leur type de déclaration.

MP

"garnote" a écrit dans le message de news:
#
Salut Michel,

Astucieux de ne prendre que les diviseurs impairs.
Et j'ai appris que Exit Function est
l'équivalent de IsPrime = False.
J'ai ajouté quelques fioritures et utilisé ta
fonction pour faire une liste des 10 000
premiers nombres premiers.

A+

Serge

Function IsPrime(Number&) As Boolean
'Il faut que Number soit un entier >=1
'Le plus grand nombre premier détecté
'par cette fonction: 2 147 483 647.
'Le nombre premier suivant est
'2 147 483 659. Il génère une erreur.
If Number = 2 Or Number = 3 Then
IsPrime = True
Exit Function
End If
If Number Mod 2 = 0 Or Number = 1 Then Exit Function
Dim Result&: Result = Number
Dim n&: n = 3
Do While Result > n
If Number Mod n = 0 Then Exit Function
Result = Number / n
n = n + 2
Loop
IsPrime = True
End Function

Sub Liste()
'Liste des 10 000 premiers nombres premiers
Dim L(1 To 10000, 1 To 2) As Long
Dim n&
L(1, 1) = 1: L(1, 2) = 2
L(2, 1) = 2: L(2, 2) = 3
i = 2: n = 3
Do Until i = 10000
n = n + 1
If IsPrime(n) Then
i = i + 1
L(i, 1) = i: L(i, 2) = n
End If
Loop
[A1:B10000] = L
End Sub



"Michel Pierron" a écrit dans le message de news:

Re garnote;
Peut être plus simple:

Function IsPrime(Number&) As Boolean
If Number Mod 2 = 0 Then Exit Function
Dim Result&: Result = Number
Dim n&: n = 3
Do While Result > n
If Number Mod n = 0 Then Exit Function
Result = Number / n
n = n + 2
Loop
IsPrime = True
End Function

MP

"garnote" a écrit dans le message de news:

Bonjour à tous et à toutes,

Cette fonction personnalisée permet de savoir si
un nombre est premier ou pas.
a) Comment faire, sans trop de If (!), pour que premier = ???
quand nombre est autre chose que :
2, 3, 4, 5, 6, 7, 8, 9, ...
b) À moins qu'il existe une fonction IsPrime !

Function premier(nombre As Range) As String
If nombre = 2 Then
premier = "Oui"
Exit Function
Else
For i = 2 To Sqr(nombre) + 1
If nombre Mod i = 0 Then
premier = "Non"
Exit Function
End If
Next i
End If
premier = "Oui"
End Function

Serge












Avatar
JpPradier
Bonsoir Michel, Serge

Si ça vous interesse, je l'avais fait avec des formules.
Dispo ici : http://cjoint.com/?cbvlM6g4D5

j-p
Avatar
garnote
Salut Jp,

Si j'ai bien compris, je pourrais entrer cette formule
=SI(NB(A3:A65536)=1;"Premier";"Non premier")
en A2. Erre-je ?

Impressionnantes formules que les tiennes.

A+

Serge


"JpPradier" a écrit dans le message
de news: %23T%
Bonsoir Michel, Serge

Si ça vous interesse, je l'avais fait avec des formules.
Dispo ici : http://cjoint.com/?cbvlM6g4D5

j-p



Avatar
JpPradier
Oui tout à fait.
J'ai oublié de préciser que ça ne fonctionne qu'avec des nombres inférieurs à 65536.
Puisque les formules utilisent la fonction Ligne(Indirect("A1:A65536")). D'ailleurs on
peut peut-etre remplacer ça par une matrice.
Ou attendre la prochaine version d'Excel et ses Millions de lignes.

j-p

"garnote" a écrit dans le message de news:

Salut Jp,

Si j'ai bien compris, je pourrais entrer cette formule
=SI(NB(A3:A65536)=1;"Premier";"Non premier")
en A2. Erre-je ?

Impressionnantes formules que les tiennes.

A+

Serge


"JpPradier" a écrit dans le message
de news: %23T%
Bonsoir Michel, Serge

Si ça vous interesse, je l'avais fait avec des formules.
Dispo ici : http://cjoint.com/?cbvlM6g4D5

j-p







Avatar
JpPradier
Re

On peut peut-etre gagner encore un peu sur le temps d'éxécution en evitant les multiples
de 5 :

On teste 1, 2, 3, 5, 7 puis avec quelque chose du genre :

Nb = Int(Sqr(Nombre))
For i = 11 To Nb Step 10
If (Nb Mod i = 0) Or (Nb Mod (i + 2) = 0) Or (Nb Mod (i + 6) = 0) Or (Nb Mod (i + 8) 0) Then
isPrem = False
Exit For
End If
Next


j-p