Programme en Ada sur les nombres premiers !

Fermé
AdaNoob - 27 sept. 2011 à 23:33
 Adanoob - 28 sept. 2011 à 20:25
Bonjour,

J'ai essayé de faire un programme qui verifie si un nombre que l'on entre dans le programme est un nombre premier ou non. (pour info il faut pour ca, diviser le nombre choisi par tous les entiers allant de 2 à sa racine carrée)
Voila le code :

with ada.text_IO;use ada.text_IO;
with ada.float_text_IO;use ada.float_text_IO;
with ada.integer_text_IO;use ada.integer_text_IO;
with Ada.Numerics.Elementary_Functions;use Ada.Numerics.Elementary_Functions;
procedure premiers is
	reste:integer;
	nombre_premier:float;
	X:float;	
begin
 loop
   put("Donnez moi un nombre et je vous dirais s'il est premier : ");
   get(nombre_premier);
   put(integer(nombre_premier)); --"integer" sert à enlever la puissance de 10 à l'affichage du nombre--
   X:=SQRT(nombre_premier);	
    for i in 2..integer(X) loop
     reste:=integer(nombre_premier) rem integer(i);
     exit when reste/=0; --ne fonctionne pas pour les multiples de 5 et pour le chiffre 9, pourquoi ?--
     put(" : non ce nombre n'est pas premier");
    end loop;
     put(" : oui ce nombre est bien un nombre premier"); --je cherche à retirer cette phrase lorsque le nombre n'est pas premier--
   new_line;
   new_line;
 end loop;
end premiers;


Mes soucis sont :
- J'aimerai comprendre et essayer de trouver une solution puisque ce programme ne marche pas avec les multiples de 5 et le chiffre 9 (plusieurs tentatives).
- Et j'aimerai lorsque le nombre n'est pas premier, retirer la phrase "oui ce nombre est bien premier"

Merci de votre aide !!

2 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
28 sept. 2011 à 05:59
Je connais pas le ada, donc ça aide pas, mais voici quelques conseils :
Je crois que le mauvais fonctionnement est dû à un problème de précision :
Il faut supprimer tous les Float et les passer en integer, ce qui, par ailleurs, allègera nettement le programme qui passe tout son temps sur cette conversion,
et puis d'après ce que j'ai trouvé sur les opérateurs, tu pourrais remplaçer 'Rem' par 'Mod', ce qui supprimera peut-être le problème sur 9 et les multiples de 5...
Quant à l'affichage de la réponse, tu pourrais ajouter un test de ce genre, en dehors de la boucle :
  si reste = 0 alors
    put(" : non ce nombre n'est pas premier");
  sinon
    put(" : oui ce nombre est bien un nombre premier");

Et pense à conditionner l'entrée dans la boucle au fait que le nombre à tester est impair, et diviser que par les nombres impairs via un équivalent de 'Step 2' dans le For...

Le chêne aussi était un gland, avant d'être un chêne
1
Oui je sais que ça allègerai le programme sauf que ce n'est pas possible de tout passer en integer. Il y aura une incompatibilité dans les calculs. Mais ça au pire c'est pas troP le souci. Pour les problèmes de multiples c'est une faute dans l'algorithme et je vais essayer de faire ce que tu mas dit et je verrai. Merci :)
0