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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <rien@absent.com> a écrit dans le message de
news:OkNMMZmJGHA.1676@TK2MSFTNGP09.phx.gbl...
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
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
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
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" <rien@absent.com> a écrit dans le message de news:
OkNMMZmJGHA.1676@TK2MSFTNGP09.phx.gbl...
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
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
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
Salut Michel,
Vais tenter de comprendre ce va-et-vient ;-)
Merci et A+
Serge
"Michel Pierron" <michel.pierron@free.fr> a écrit dans le message de news:
eycsvtmJGHA.964@tk2msftngp13.phx.gbl...
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" <rien@absent.com> a écrit dans le message de news:
OkNMMZmJGHA.1676@TK2MSFTNGP09.phx.gbl...
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
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
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
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" <rien@absent.com> a écrit dans le message de news:
OkNMMZmJGHA.1676@TK2MSFTNGP09.phx.gbl...
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
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
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
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" <michel.pierron@free.fr> a écrit dans le message de news:
uXGSRQqJGHA.1388@TK2MSFTNGP11.phx.gbl...
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" <rien@absent.com> a écrit dans le message de news:
OkNMMZmJGHA.1676@TK2MSFTNGP09.phx.gbl...
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
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
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
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" <rien@absent.com> a écrit dans le message de news:
#PKoUC2JGHA.516@TK2MSFTNGP15.phx.gbl...
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" <michel.pierron@free.fr> a écrit dans le message de news:
uXGSRQqJGHA.1388@TK2MSFTNGP11.phx.gbl...
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" <rien@absent.com> a écrit dans le message de news:
OkNMMZmJGHA.1676@TK2MSFTNGP09.phx.gbl...
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
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
JpPradier
Bonsoir Michel, Serge
Si ça vous interesse, je l'avais fait avec des formules. Dispo ici : http://cjoint.com/?cbvlM6g4D5
j-p
Bonsoir Michel, Serge
Si ça vous interesse, je l'avais fait avec des formules.
Dispo ici : http://cjoint.com/?cbvlM6g4D5
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
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
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" <rien@absent.com> a écrit dans le message de news:
uxlVvL3JGHA.2392@TK2MSFTNGP09.phx.gbl...
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" <jp.pradier.JVeuxPasDeSpam@wanadoo.fr> a écrit dans le message
de news: %23T%23rjv2JGHA.312@TK2MSFTNGP09.phx.gbl...
Bonsoir Michel, Serge
Si ça vous interesse, je l'avais fait avec des formules.
Dispo ici : http://cjoint.com/?cbvlM6g4D5
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
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
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
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