maia Le 10/11/2007 à 18:05 bonjour,
j'aimerais créer un programme pr TI-84+ qui permette de dire si un nombre est premier ou non, et si la réponse est non, de donner un diviseur (autre que 1 et lui-même).
je pense voir ce qu'il faut demander à la calculatrice: d'abord, lui rentrer le nombre à tester A, puis lui faire diviser ce nombre par tous les nombres premiers n tels que n²<A. l'idée est de lui faire regarder si A/n moins la partie entière de A/n est égal à 0. Dans ce cas, elle devrait afficher "nombre non premier, diviseur: n". sinon, elle doit continuer à tester, et si elle arrive jusqu'à n tel que n²<A, afficher "nombre non premier". Evidemment, elle ne pourra pas tester de façon infinie. je pense rentrer les 100 premiers nombres premiers dans une liste. si elle n'arrive à aucun résultat avec ces 100 n différents, il faudrait qu'elle affiche quelque chose comme "nombre à tester trop grand".
Déjà, est-ce que ce raisonnement est juste?
Et... comment l'exprimer dans un programme (c'est une des premières fois que j'en fais, et celui-là ne me semble pas tout facile car plutôt fastidieux...).
Merci à celles et ceux m'aideront!
chimiepower
gon33 Le 11/11/2007 à 12:39 Le raisonnement est tout à fait juste. Cependant, comme on ne peut pas rentrer un nombre infini, tu n'est pas obligé de limiter le nombre de tests.
Avec un légère modif sur le "n²<A", voilà la traduction en programme de calculette:
:ClrHome ## "Nettoyer l'écran"
:input "Nombre:",A ## Demande un nombre et le rentre dans A.
_ _
:For(N,2,√A +1) ## Pour un nombre N, de 2 à √A + 1, faire:
:if Int(A/N)=0 ## Si la partie entière de A/N vaut 0,
:Then ## Alors
:Print "Diviseur",N ## Afficher que N est diviseur
: Stop ## Terminer le programme
:End ## Fin du Si: le code qui suit est exécuté dans tous les cas (en temps normal), mais comme là on a terminé le programme dans le cas ou la condition est vraie, ce code n'est exécuté que si la condition est fausse.
:End ## Fin du For.
:Print "C'est un nombre premier."
maia Le 12/11/2007 à 17:52 Merci gon33!
en changeant la 4ème ligne en (A/N)-int(A/N), ça marche très bien!
gon33 Le 12/11/2007 à 19:09 Oui, c'est vrai qu'il y avait une erreur^^
C'était avec plaisir...
Continue de programmer!
gon33 Le 17/11/2007 à 09:00 Ce serait quel genre, ton algo? (je suis déjà au courrant pr les entiers pairs, mais là le but c'était de faire simple...)
very Le 17/11/2007 à 12:47Edité par very le 17/11/2007 à 18:30 tu peux pas modifier à l'infini le pas donc faut arriver à faire des tests de divisibilités.
si t'a bien implémenté ces test, ça va beaucoup plus vite que de faire la grosse division. Bon en ti-basic ça doit pouvoir se discuter..
Sinon l'autre méthode c'est le crible d'érathosthène quoi, mais bon c'est utile que si tu veux plus de choses
Enfin une bonne mothode de tricheur c'est de tabuler les quelques premiers nombres premiers, ça gagne bcp..
edit: fr..
«Les gens exigent la liberté d’expression pour compenser la liberté de pensée qu’ils préfèrent éviter.» - Sören Kierkegaard
La République, c’est comme la syphilis : quand on l’a attrapée, soit on se fait sauter le caisson, soit on essaie de vivre avec.
gon33 Le 17/11/2007 à 18:02 (Eratosthène)
Ouais, ça a l'air sympas et je connaissait pas...
very Le 17/11/2007 à 18:38 Bon d'après un rapide calcul pifomètrique faut dans les n/log(n) divisions pour ératosthène alors que la méthode diviser par chaque nombre est au pire en sqrt(n).
mais bon si tu code bien ératosthène (ie t'a un tableau ou l'indice représente le nombre et tu check avec 0/1 la primalité en faisant à chaque fois des multiplications -- tu fais t[j*i] = 0; --, pas des divisions ) ça doit limite être plus performant pour des nombres qui vont bien ( pas trop petit, et pas trop grand). Sans compter tout ce que t'a en plus.
«Les gens exigent la liberté d’expression pour compenser la liberté de pensée qu’ils préfèrent éviter.» - Sören Kierkegaard
La République, c’est comme la syphilis : quand on l’a attrapée, soit on se fait sauter le caisson, soit on essaie de vivre avec.