DÉCOMPOSITION D'UN NOMBRE EN FACTEURS PREMIERS

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 25 juin 2005 à 16:14
cs_Lisa46 Messages postés 99 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 20 août 2008 - 21 oct. 2005 à 22:06
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/32323-decomposition-d-un-nombre-en-facteurs-premiers

cs_Lisa46 Messages postés 99 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 20 août 2008
21 oct. 2005 à 22:06
Attention, j'ai mélangé dans les lettres: t, a, etc...corrige...

Et tu comprends, Julien que:
1)
dim a as variant
Variant attrape tout, même "12mlip"; a est alors déclaré, mais bon, on peut modifier comme tu le dis.
Pas décalré = variant on me dit toujours !C'est idem !
2)
a =text1.text
v = val(text1.text)
F = Fix(val(text.text))

Ma NOUVELLE IDée que: a v F 'alors va au programme, ta saisie est bonne...

Cette double égalité correspond à la nécessité pour que la saisie soit un nombre entier !
C'est mathématique, non ?
.....
RE-VOICI, puisque tu n'as pas reçu le message privé...

On Error Resume Next
Dim a As Variant: Dim v As Double: Dim F As Double

a = Text1.Text ' a est variant donc attrape -tout ???
v = Val(Text1.Text)
F = Fix(Val(Text1.Text))

If a v And v F And v <> 1 And v <> 0 Then
Label1.Caption a: Label2.Visible True (Ou label1.caption = text1.text, si tu veux, mais je vois que ça marche!)
Else
Label1.Caption "Entrez un entier positif différent de 1 et 0": Label2.Visible False
Exit Sub
End If
If v < 0 Then
Label1.Caption "Entrez un entier positif. ": Label2.Visible False
Exit Sub
End If

Programme:

'Text1.Text = a
'enleve les valeurs incorrectes que peut prendre le texte ( 1,2 ou frz...)

For n = 2 To a
DoEvents

For i = 2 To Sqr(n) + 1
DoEvents

If (n And 1) = 0 Then
Exit For
End If

If n Mod (2 * i - 1) = 0 Then
Exit For

End If

Next i

If i > Sqr(n) Then
If a / n = Fix(a / n) Then
'Si le nombre est divisible par n qui est premier
a = a / n
'Alors on le remplace a
List1.AddItem (n)
'et n fait partie des diviseurs premiers de n
n = n - 1
'cette derniere opération permet de chercher le nombres de n nécéssaires à la décomposition (exemple n=8 décomposition 2*2*2) sans cette derniere opération le résultat est juste que si les coefficients de tout les n sont 1
End If
End If

Next n

a = Label1.Caption
'sa s'est juste pour que text1 redevienne ce qu'il était au départ et c'est pour toi SDan qui ne comprenais pas pourqu
cs_Lisa46 Messages postés 99 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 20 août 2008
19 oct. 2005 à 18:23
J'ai fait fait un petit progr. de tests:
1-XP paramétré virgule:
a) text 2,6 ; Val 2; Fix =2 donc Val ne sait pas lire 2,6
b) Text 2.6 ; Val 2,6 ; fix 2. Là, Val lit le point décimal et transcrit en virgule 2,6.

2-XP paramétré point:

a) text 2,6 ;val 2 fix2 val = fix; Val ne lira pas 2,6 numérique
b) text 2.6 ; val =2.6 et Fix = 2

Conclusion 1 :
Val sait lire que le point décimal qq. soit le paramétrage.
Val sait écrire 2.6 en 2,6 en paramétrage virgule

Donc Val sait écrire le décimal virgule (paramétrage virgule de XP), Mais ne sait jamais lire le décimal virgule.(2,6)

Pour bloquer une saisie décimale, il me semble que, le plus simple : satisfaire la double égalité:

If Text1.text val(text1.text) Fix(val(text1.text))then
aller au programme (goto)
else
"Message entrez un entier"
exit sub
End If
exit sub

Car attention, avec 2,6 on a:
val(text1.text) = Fix(Val(text1.text))

val donnant 2 dans tout paramétrage de Windows.

Il me semble avoir trouvé..voir ???
Lisa

J'ai fait ceci :

Private Sub Command1_Click()
Dim a As Variant 'ceci un programme test en observant les réponses
Dim q As Single
Dim v As Double
Dim f As Integer
a Text1.Text: Label4.Caption a
v Val(Text1.Text): Label6.Caption v
f Fix(Val(Text1.Text)): Label8.Caption f
Label10.Caption = 9 / 2 'teste le paramétrage Windows point ou virgule

End Sub
cs_Lisa46 Messages postés 99 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 20 août 2008
18 oct. 2005 à 16:13
Julien et ceux qui lisent; :

Mon idée de stopper l'entrée de tout décimal, point ou virgule a un hic ! J'ai trouvé où ça coince et je recopie ici.

Info pour les débutants comme moi :

Dans un programme d'entiers, pour éliminer sans bug les entrées décimales, tel 4.21 et aussi 4,21 j'avais trouvé ceci :

dim a as double

if val(text1.text) <> Text1.text or Fix(a) <> a then
label1.caption= "Vous devez Entrer un entier"
exit sub
end if

Ainsi avec 2.6 ou 2,6 sur mon PC ça marche dans les deux cas, mais pas sur le second PC qui dit "Type incompatible", pour 2.6 mais marche dans l'autre cas.
La raison simple, je vois:
le second PC a pour symbole décimal dans Windows la virgule et le premier le point.

Avec le point, Windows, donc VB, comprend bien le programme dans les deux cas. La virgule est logiquement considérée comme du texte par VAL.
Mais dans le cas inverse de paramétrage virgule, le point est refusé par Windows et pas considéré comme du texte par VAL comme il le devrait !
Une incohérence de Windows et de VB6...

Et mon problème n'est pas résolu pour tout PC.

Si vous avez un truc simple ? Merci !
Lisa
cs_Lisa46 Messages postés 99 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 20 août 2008
17 oct. 2005 à 14:43
Je vais essayer 10 pour les nombres premiers, très utile! Je prends, j'ai pas ça !
Je t'ai écrit sur ma source, que tu essaies mon truc et que tu me dises! Un grand service, merci !Au fait ici, tu peux stopper l'entrée (aussi) des nombres négatifs ?
En début de programme:
If a<0 then label5.caption =" Entrez des entiers positifs ! ": exit sub

(C'est du basic, sauf que on met print "..." au lieu du label et un goto vers étiquette en fin de code.). Pas loin du VB, hein ?

Et tu pouvais faire suivre de ma condition pour larguer les décimaux x,n... et les x.n...
Si elle est confirmée, ma procédure, justement à étudier par un + fort que moi en VB !
Ce que je demande...

erci pour tout!
Bizz
Lisa
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
16 oct. 2005 à 20:59
La note n'était pas si sévere que sa c'est pas extraordinaire ce code mais bon sa fait toujours plaisir d'avoir une bonne note.
Merci, bon courage pour tes programmes.
cs_Lisa46 Messages postés 99 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 20 août 2008
16 oct. 2005 à 20:55
T'es sympa mais je t'assure que j'ignore plein de choses et je fais avec mes propres éléments limités. Au fond c'est plus dur qd on possède moins de cartes dans son jeu! Mais je f vaius finir en qq mois ce cours débutant de Diane Zak et j'en saurais plus.
La note de 4.5 est sévère, c'est pas évident de demander à l'ordi de décomposer en facteurs premoiers, ni de décomposer une racine. Je te mets 10, aussi pour compenser cette note trop basse !Je peux pas mettre 12...
Bonne soirée !
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
16 oct. 2005 à 17:15
J'ai ajouté le label et la commande quitter c'est vrai c'est des détails mais c'est pas plus mal.

En revanche pour les valeurs incorectes j'aime autant demander au programme de les régler (j'ai quand meme rajouté une msgbox signalant l'erreur)

Merci de ce commentaire et ne te dévalorise pas en disant que tu ne connait rien au vb je ne pense pas que ce soit bénéfique, j'ai regardé ce que tu savais faire et je ne dirais pas que c'est rien.
cs_Lisa46 Messages postés 99 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 20 août 2008
16 oct. 2005 à 15:54
J'ai lu ton programme sobre de décomposition et bien réussi. Je vois qu'en effet ceux rompus au VB emploient des instructions différentes dont bcp sont inconnues pour moi.
Pour ça que je pense ne savoir que 4% du VB. En fait je fais du code basic avec une interface VB.
Bien que Do Loop, etc soient Basic et je maîtrise pas...
Mais si je lis un code Basic (ancien, donc), je comprends.
Je te passerai ma décomp. par mail. J'ai un peu honte de présenter du Basic ici...
Un détail :
Tu pouvais prévoir un label "Entrer votre nombre", et un Bouton Quitter ? (Là ça te prends 1 minute pour le mettre...sourire.)

Détail no 2:
Et prévoir l'entrée par erreur de 2.18 ou 2,18 par exemple où ton progr donnera alors 2. Je le fais moi, désormais.
Pour arrêter la procédure, si un décimal est entré par erreur:
Je fais un truc du genre et que je disais à US :

If val(text1.text) <> text1.text or Fix(a) <> a then

>un message d'avertissement "Pas de décimaux"
> et sortir du code.

End If

no1: Val ne prend pas à partir de la virgule considérée comme texte
et no 2: si a est pris comme décimal, il est refusé également car a <> Fix(a).
Dis-moi ce que tu en pneses.
Ceci marche sur mon PC. Tu me diras.

Je suis poisse, hein?
MaX_62 Messages postés 879 Date d'inscription vendredi 22 octobre 2004 Statut Membre Dernière intervention 29 juin 2007
26 juin 2005 à 18:25
Pas mal !
J'avais fait un code similaire, mais sous la forme d'une fonction, qui retourne une expression de la forme i^j*k^l ; je trouve que c'est plus pratique... Si tu veux voir l'algorythme utilisé : http://www.vbfrance.com/code.aspx?ID=31260
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
25 juin 2005 à 19:51
Merci à DarK Sidious pour ses conseils que j'ai suivi du mieux que je pouvais et SDan j'ai modifié mon code pour qu'a la fin tu retrouves 111 c'était pas voulu au départ mais sa ne servait en effet à rien non plus de le laisser afficher 1 à chaque fois
cs_SDan Messages postés 288 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 13 juin 2008
25 juin 2005 à 16:21
Salut,

Je viens de tester ton application avec l aversion 5.0 de VB, ça marche trè bien. Par contre, il y a qqch qui m'ennuie un peu et ou je ne comprends pas, par exemple, j'ai tapé 111 et puis j'ai cliqué sur Calculer. là, je suis tombé sur 3 et 37, tout à fai td'accord ave ctoi car 3 * 37 = 111 seulement, là ou j'ai tapé 111, il y a seulement l epremier chiffre qui s'affiche. Pourquoi? mais à droite, il met bien 111 est le produit de snombres premiers suivants : 3 et 37.

Sinon pas mal du tout.
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
25 juin 2005 à 16:14
J'ai pas regardé dans le détail l'algorithme utilisé.

Par contre quelques remarques concernant le code. Ce n'est pas pour te décourager, bien au contraire, c'est pour t'encourager à faire du code plus propre :
* Pas d'indentation
* Aucune variable déclarée
* Aucun espace entre les lignes

Bref, ton code est difficile à lire (encore là ca va vu qu'il n'est pas très long, mais sur une fonction de plus de 100 lignes, ca deviendrais suicidaire de te relire ;)

DarK Sidious
Rejoignez-nous