Posté par
Bthomas BthomasBonjour,
je suis en première année de prépa math et suis des cours d'info depuis janvier.
Je bloque complètement sur une question d'un DM d'info ( langage utilisé Caml light) :
Je dois écrire la fonction div_eucl qui renvoie le couple formé du quotient ( un entier sous forme de chaîne ) et du reste ( un entier ) dans la division euclidienne d'un entier sous forme de chaîne par un entier.
Par exemple , je lui dis div_eucl « 135214 » 8716 et il te renvoie « 15 » 4474.
L'avantage du programme est qu'on peut diviser un entier aussi grand qu'on veut, puisque le nombre de caractères qu'on peut mettre dans une chaîne est presque illimité alors que caml ( en tout cas le light ) ne calcule pas avec des entiers au dessus de 2^30-1=1073741823.
Pour répondre, je me suis inspiré de l'algorithme qu'on fait naturellement en posant une division euclidienne et ça a donné :
let div_eucl e d=
let a=ref"" in
let q=ref"" in
let l=string_length e in
for i=0 to l-1 do begin
a:=!a^"e.(i)" ;
q:=!q^(string_of_int ((int_of_string !a)/d)) ;
a:=string_of_int((int_of_string !a) mod d)
end
done;
(!q,int_of_string !a);;
Caml ne signale aucune erreur de syntaxe et m'a bien dit
div_eucl : string -> int -> string * int = <fun>
C'est donc ce qui était attendue. Mais à chaque fois que je lui donne un calcul, il me dit
Uncaught exception: Failure "int_of_string"
Mon algorithme en lui même me semble bon, je l'ai testé à la main avec des nombres pas trop grands et c'est bien ce qu'on fait quand on pose une division. Le seul petit défaut que je lui avais trouvé est qu'il mettait quelques zéros inutiles devant mon quotient, mais j'ai aussi mis au point un programme ( qui marche !! ) pour éliminer les zéros inutiles sur mes chaînes. Pour résoudre le problème du : Failure "int_of_string", j'ai essayé de mettre des parenthèses, d'enlever des espaces, … mais je ne trouve pas. Si quelqu'un trouve le problème, ça serait vraiment sympa. Merci d'avance.