TROUVER LES DIVISEURS ENTIER D'UN NOMBRE ENTIER

cs_mehdibou Messages postés 365 Date d'inscription vendredi 24 mai 2002 Statut Membre Dernière intervention 18 octobre 2004 - 29 juil. 2003 à 19:25
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 2 août 2003 à 15:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/8040-trouver-les-diviseurs-entier-d-un-nombre-entier

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
2 août 2003 à 15:38
Dans ce type de prog, je propose une procé dure qui dit à peu près :
sub SepPremier(byval NB as variant, byref TablResult() as variant) ' Dans VB6 cela permet d'avoir le type decimal.
redim TablResult(-1 to -1)
a=2
do while NB>0
if nb mod a=0 then
'procédure d'elargissement du tableau
TablResult(ubound(TablResult))=a
else
if a=2 then a=3 else a=a+2
end if
loop
End Sub

Voilà comment je concois la routine(Je n'ai pas encore télécharger ton prog).
les limites de -1 to -1 servent à dire que le tableau est vide, lbound est à 0 quand il y a au moins 1 donnée dans le tableau.
cs_mehdibou Messages postés 365 Date d'inscription vendredi 24 mai 2002 Statut Membre Dernière intervention 18 octobre 2004
31 juil. 2003 à 18:14
Oui, j'avais essayé avec un currency. Cependant on ne pourra pas profiter de tous les chiffres (4 sont perdus derrières la virgule et la fonction Sqr() retourne un double dont le nombre de chiffres significatifs sera inférieur à celui du Currency donc donnera des résultats faux et si tu n'utilise pas la méthode avec Sqr(), ça sera tellement long que tu ne voudras même pas chercher les diviseurs d'un nombre aussi grand...).
Donc Currency augmente le nombre de chiffres, oui, mais il faut tout de même le limiter. Et si possible effectuer les opérations avec un Long si le nombre est <= 2147483647.
Chose bizarre : sur msdn dans la liste des types de données de visual basic, il y a un type Decimal, cependant je n'ai pas retrouvé ce type dans VB.. (même s'il y a bien la constante vbDecimal du enum vbVarType : (??)
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
31 juil. 2003 à 16:06
Le type integer limite à 32767 mais long n'est qu'à 2 milliard et des poussière en variant ou currency on les dépasse de loin.
cs_mehdibou Messages postés 365 Date d'inscription vendredi 24 mai 2002 Statut Membre Dernière intervention 18 octobre 2004
29 juil. 2003 à 19:25
J'ai téléchargé ta source car j'en avais fait une semblable (je crois pas l'avoir mise sur vbfrance..).
Et voici quelques conseils, remarques, critiques, etc...:
- tu devrais aligner le texte à droite pour les nombres et limiter le nombre de caractères dans la textbox
- Ajoute Option Explicit et déclare toutes tes variables et types les (les fonctions aussi)
- dans Get_Resultat(), If res < Int(res) Then ne sera jamais exécuté car Int(res) est tjr <= à res : Int tronque mais n'arrondi pas !
- Utilise des ElseIf plutot que Exit Function et End If, c'est plus clair
- Get_Reste() => remplace la fonction par l'opérateur modulo : Dividende % Diviseur
- Trim(Mid(mot, v, 1)) <= Trim est inutile car tu prends un seul caractère de la chaine et ensuite tu le compare à "0"
- Utilise toujours des $ pour les fonctions qui retournent une chaine de caractère, c'est plus propre et plus rapide, exemple : Mid$(mot, v, 1))
- CorrigeMot() <= tu peux le remplacer par val()
- dans Try_for_diviser() : 2x Dividende = 0 ??
- je ne sais pas où tu es aller chercher Try_for_diviser() c'est vraiment compliqué ; tu aurais pu faire res=dividende/diviseur: if res=int(res) Then....
- tu utilise des Integer donc ton programme se limite à 32767, utilise plutot des Long pour aller un peu plus loin que 2milliards
- tu tests tous les nombres de 2 jusqu'au nombre, une méthode beaucoup plus rapide consiste à ne chercher que pour les nombres de 2 à la racine carrée du nombre (ça donne la 1ère moitié de la liste et pour la seconde, il faut prendre l'_inverse_)
- vide ta liste avant de la remplir à nouveau
- 1 et le nombre n'apparaissent pas, pourtant ils sont bien diviseurs du nombre
@+ et bonne continuation
Rejoignez-nous