Accueil > > > [VB 8][.NET 2]LES DIVISEURS D'UN NOMBRE + NOMBRES PREMIERS (ENUMÉRATOR & TESTEUR) + FACTORISATION PREMIÈRE + PGCD + PPCM
[VB 8][.NET 2]LES DIVISEURS D'UN NOMBRE + NOMBRES PREMIERS (ENUMÉRATOR & TESTEUR) + FACTORISATION PREMIÈRE + PGCD + PPCM
Information sur la source
Description
Tout est dans le titre ;) Bon ici pour des raisons de simplicité j'ai utilisé une list(Of Integer) pour les résultats. Il est évident que si on veut encore gagner en rapidité, on doit passer par des array... On peut aussi éviter Sort en mettant les div1 dans un array et les div2 dans un autre puis joindre les deux tableau (Div1[0]=>Div1[X] & Div2[X]=>Div2[0]) Enfin le résultat est la ! 33 fois plus rapide à trouver les diviseurs de 2007 que la méthode classique ! A part pour 2 et 3 ou cela est plus long (à peine) - à cause de l'appel de List.Sort() -, le script prouve son efficacité ! Pour calculer des diviseurs de 15, ma méthode s'est avérée 1,5 fois plus rapide ! Juste à titre d'exemple, la recherche des diviseurs de 53612 prend 191 fois moins de temps avec ma méthode (326406 contre 62337475) Celles des diviseurs de 100 mille : 230 fois plus rapide(514768 contre 118490968) <EDIT()> _ Public Class Comment '' La nouvelle version est en mode Windows et permet en plus tout ce qui est dit dans le titre ! (PGCD, PPCM, Factorisation première, ...) '' De plus, les chiffres de rapidité décrit au dessus ne sont plus valide. La vitesse a été augmentée par deux pour les nombres pairs (et est restée inchanger pour les impairs) End Class
Source
- ' ANCIEN CODE (Application Console, démontrer la puissance de getDivs, une nouvelle version encore plus rapide existe dans le ZIP)
- Public Module MainModule
-
- Public Sub Main()
- On Error GoTo EndSub
- Do
- Console.Write("Entrez un nombre pour en connaître les diviseurs, N pour quitter: ")
- Dim Number As Integer = CInt(Console.ReadLine())
- Dim Diviseurs As List(Of Integer) = getDivs(Number)
- Console.Write("Le nombre que vous avez choisit a ")
- For I As Integer = 0 To Diviseurs.Count - 1
- Console.Write(Diviseurs(I) & IIf(I = Diviseurs.Count - 1, " ", ","))
- Next
- Console.WriteLine("pour diviseurs.")
- '' <TEST>
- Dim TimeWatcher As New Diagnostics.Stopwatch()
- TimeWatcher.Start()
- For X As Integer = 0 To 10000
- getDivs(Number)
- Next
- TimeWatcher.Stop()
- Console.WriteLine("La méthode que j'utilise :" & TimeWatcher.ElapsedTicks)
- TimeWatcher.Reset()
- TimeWatcher.start()
- For X As Integer = 0 To 10000
- getDivs_Bad(Number)
- Next
- TimeWatcher.Stop()
- Console.WriteLine("La méthode classique :" & TimeWatcher.ElapsedTicks)
- '' </TEST>
- Loop While True
- EndSub:
- End Sub
-
- Public Function getDivs(ByVal Number As Integer) As List(Of Integer)
- getDivs = New List(Of Integer)
- Dim Div1 As Integer = 1
- Dim Div2 As Integer = Number
- While Div1 <= Div2
- If Div1 * Div2 = Number Then
- getDivs.Add(Div1)
- If Div1 <> Div2 Then getDivs.Add(Div2)
- End If
- Div1 += 1
- Div2 = Number \ Div1
- End While
- getDivs.Sort()
- End Function
-
- Public Function getDivs_Bad(ByVal Number As Integer) As List(Of Integer)
- Dim getDivs As New List(Of Integer)
- getDivs_Bad = getDivs
- For Div As Integer = 1 To Number
- If Number Mod Div = 0 Then getDivs.Add(Div)
- Next
- End Function
-
- End Module
' ANCIEN CODE (Application Console, démontrer la puissance de getDivs, une nouvelle version encore plus rapide existe dans le ZIP)
Public Module MainModule
Public Sub Main()
On Error GoTo EndSub
Do
Console.Write("Entrez un nombre pour en connaître les diviseurs, N pour quitter: ")
Dim Number As Integer = CInt(Console.ReadLine())
Dim Diviseurs As List(Of Integer) = getDivs(Number)
Console.Write("Le nombre que vous avez choisit a ")
For I As Integer = 0 To Diviseurs.Count - 1
Console.Write(Diviseurs(I) & IIf(I = Diviseurs.Count - 1, " ", ","))
Next
Console.WriteLine("pour diviseurs.")
'' <TEST>
Dim TimeWatcher As New Diagnostics.Stopwatch()
TimeWatcher.Start()
For X As Integer = 0 To 10000
getDivs(Number)
Next
TimeWatcher.Stop()
Console.WriteLine("La méthode que j'utilise :" & TimeWatcher.ElapsedTicks)
TimeWatcher.Reset()
TimeWatcher.start()
For X As Integer = 0 To 10000
getDivs_Bad(Number)
Next
TimeWatcher.Stop()
Console.WriteLine("La méthode classique :" & TimeWatcher.ElapsedTicks)
'' </TEST>
Loop While True
EndSub:
End Sub
Public Function getDivs(ByVal Number As Integer) As List(Of Integer)
getDivs = New List(Of Integer)
Dim Div1 As Integer = 1
Dim Div2 As Integer = Number
While Div1 <= Div2
If Div1 * Div2 = Number Then
getDivs.Add(Div1)
If Div1 <> Div2 Then getDivs.Add(Div2)
End If
Div1 += 1
Div2 = Number \ Div1
End While
getDivs.Sort()
End Function
Public Function getDivs_Bad(ByVal Number As Integer) As List(Of Integer)
Dim getDivs As New List(Of Integer)
getDivs_Bad = getDivs
For Div As Integer = 1 To Number
If Number Mod Div = 0 Then getDivs.Add(Div)
Next
End Function
End Module
Conclusion
COMMENT CA MARCHE ? ====================
Et bien c'est simple ! (Soit N le nombre)
1) La technique habituelle : On teste tous les nombres (X) de 0 à N, et si N\X=0, on le prend Cela veut dire que l'on fait N fois l'opération
2) L'autre technique On teste tous les nombres jusqu'à ce que le premier diviseurs soit plus grand que le deuxième.
Conctrètement : cherchons les diviseurs de 10 : 1) 1 : Divseur, 2 : Diviseur, 3, 4, 5 : Diviseurs, 6, 7, 8, 9, 10 : Diviseur (10=10 : FIN) 2) 1 et 10 : Diviseurs, 2 et 5 : diviseurs, 3 et 3, (4>2 : FIN) ==> J'ai fais 4 opération, alors qu'il en faut 10 avants :
Concrètement, ce gain s'exprime avec la formule suivante : 1) Opérations = N 2) Opérations = (Racine de N) + 1
Si qqun trouve encore mieux (passer par des arrays déjà triés, ...), qu'il poste, moi j'ai donné le principe, je ne compte pas aprofondir (c'est pas tous les jours qu'on chercher les diviseurs de 852047!)
Historique
- 22 janvier 2007 20:17:54 :
- Explication du principe (et gain)
- 27 janvier 2007 12:28:07 :
- Ajout de fonctions, améliorations de l'algorythme, ...
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Liste de nombres aléatoires [ par Supo ]
Hello j'voudrais savoir comment on fait une liste de nombre aléatoire QUI NE RÉPÈTE JAMAIS 2 FOIS LE MÊME NOMBRE.
base de données ajout de nombres [ par kidpigeyre ]
je cherche à lire un nombre du text1 qui se rapporte à la base de données de lui ajouté un autre nombre et de le replacer dans la base de donnée.Aidez
base de données ajout de nombres [ par kidpigeyre ]
je cherche à lire un nombre du text1 qui se rapporte à la base de données de lui ajouté un autre nombre et de le replacer dans la base de donnée.Aidez
Comment faire pour que l'ordi genere 2 nombres qui divisé entre eux donne un nombre entier [ par RickBlood ]
RickBloodmailto: beaumontdominic@hotmail.comPour vous servirJe veut savoir comment on fai
manipulation de grand nombres [ par pop49 ]
Bonjour, Au-delà de 99999... (15 fois le chiffre 9), un nombre (pourtant défini de type Double) est systématiquement tronqué par VB 6 et noté en écrit
nombre aleatoir [ par tarzom ]
salut , voila j'ai plusieur label avec des nombres different et je voudrais faire un tirage aleatoir avec ces nombres comment faire ?merci de votre ai
Sortie aléatoire "spéciale" !!! [ par rocknroll2 ]
Salut à tous.Désolé de solliciter vos connaissances encore une fois !Mon problème:J'ai des données string qui sont à 90 pour cent des nombres (enregis
VB6 Supprimer des nombres après la virgule [ par JeffC1977 ]
Salut...Je suis à la recherche du code pour pourvoir supprimer une quantité de chiffre apès la virgulePar exemple, j'ai le nombre 52,99
|
Derniers Blogs
[SHAREPOINT] NOUVELLE PRéSENTATION POUR LA DOCUMENTATION SHAREPOINT SUR TECHNET.[SHAREPOINT] NOUVELLE PRéSENTATION POUR LA DOCUMENTATION SHAREPOINT SUR TECHNET. par Patrick Guimonet
Vous l'avez peut-être déjà remarqué ? La documentation SharePoint a subit un cure de "relooking" et prend un style inspiré de Metro, donc plus sobre, plus pur, plus clair ! C'est sur fond blanc et ca ressemble à ça : Globaleme...
Cliquez pour lire la suite de l'article par Patrick Guimonet ASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHEASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHE par fathi
Tout le monde est unanime pour dire que la programmation multi-thread et asynchrone est en train de devenir un sujet incontournable. Beaucoup de choses sont arrivées avec le framework 4 pour le code parallèle (TPL, PLinq,.) et bientôt, on va avoir l...
Cliquez pour lire la suite de l'article par fathi PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS !PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS ! par Etienne Margraff
J'ai récemment eu un problème pour obtenir l'intelliTrace sur un site web dans IIS. Il n'y avait pas de message d'erreur, rien dans le journal d'évènement Windows, et après 3 appels à une voyante, 2 visites chez un marabou, j'ai failli me résign...
Cliquez pour lire la suite de l'article par Etienne Margraff OFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONSOFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONS par junarnoalg
De nombreuses entreprises font le choix de SharePoint Online, service fourni au travers de l'offre de Microsoft Office 365. S'il est vrai que ce choix apporte un grand nombre d'avantages; rapidité de mise en œuvre, disponibilité, large couvertu...
Cliquez pour lire la suite de l'article par junarnoalg PRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGEPRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGE par richardc
http://www.c2idotnet.com/articles/presentation-des-api-rest-de-windows-azure-lister-les-comptes-de-storage
Désolé pour "toto", mais c2i existait avant blogs.developpeur.org et c'est mon site "officiel" ;-) ...
Cliquez pour lire la suite de l'article par richardc
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|