Page 1 of 1

Division euclidienne

Unread postPosted: 15 Apr 2015, 07:33
by Lu_Lu54
salut à tous !

Je suis en train de faire un programme en nspire basic qui réalise la division euclidienne step by step.
C'est plus compliqué que ce que je ne pensais, alors j'ai besoin de petits conseils...

voilà ce que j'ai fait pour l'instant :
Code: Select all
Define LibPub div_euclid(av,b)=
Prgm
:Local az,dimap,av,a,ap,b,result,ach,dimach
:
:
:Disp av,"     ∣     ",b
:Disp "           ∣————"
:
:
:result:=int(((av)/(b)))
:a:=av
:ap:=string(a)
:dimap:=dim(ap)
:dimap:=dimap-2
:dimap:=dim(ap)-dimap
:
:Loop
:If a<b Then
:  Exit
:EndIf
:a:=approx(a)
:ach:=string(a)
:dimach:=dim(ach)
:a:=int(av*10^(−dimach+3))
:Disp a
:Disp "-    ",b*int(((a)/(b)))
:Disp "——————"
:Disp a-b*int(((a)/(b)))
:If a-b*int(((a)/(b)))<b Then
:  Exit
:EndIf
:Disp dimap,"ok"
:az:=mid(ach,dimap,1)
:Disp az,"ok"
:az:=expr(az)
:Disp az,"ok"
:a:=10*(a-b*int(((a)/(b))))+az
:Disp a
:dimap:=dimap+1
:EndLoop
:EndPrgm


Si vous arrivez à le déchiffrer (je ne respecte selon moi aucune syntaxe lisible :D), vous pouvez voir que j'ai un petit problème concernant "l'abaissement" du chiffre suivant dans le nombre...
En fait, je veux utiliser mon reste pour ce faire, et faire ici 10*reste+az, az étant une variable qui contiendrait séparément du reste le chiffre "suivant".
cette variable doit bien sûr pouvoir évoluer, puisque le programme doit pouvoir marcher sur plusieurs étapes.

P.S.
J'imagine que tout n'est pas clair dans ma source :#roll#: , mais je règlerai les autres problèmes par moi même, et je propose de rester concentré sur ce problème précis pour ne pas allonger le topic >:]

Merci !

Re: Division euclidienne

Unread postPosted: 15 Apr 2015, 08:15
by Bisam
Tout d'abord, pour ta division euclidienne, je te suggère vivement d'utiliser les fonctions intdiv(a,b) et remain(a,b) qui renvoient respectivement le quotient et le reste dans la division euclidienne de a par b.

L'intérêt est d'éviter de passer par des nombres réels et de rester dans les entiers... il pourrait y avoir de grosses erreurs d'approximations si tes entiers sont très gros.

Ensuite, pour couper en tranches de 3, tu peux aussi utiliser le logarithme décimal : floor(log(a))+1 renvoie le nombre de chiffres dans ton nombre.

Après ces modifications, je veux bien que tu réexpliques ce qui te pose problème un peu plus en détail, car j'avoue que je n'ai pas bien compris.

Re: Division euclidienne

Unread postPosted: 15 Apr 2015, 09:59
by Lu_Lu54
Super, ça va déjà bien m'avancer !
je change ça et je re-post...

Merci !

Re: Division euclidienne

Unread postPosted: 16 Apr 2015, 11:34
by Lu_Lu54
Bon, j'ai un peu travaillé, et ça donne ça :
Code: Select all
Define LibPub div_euclid(av,b)=
Prgm
:Local az,ind,av,a,ap,b,result,ach,dimach
:
:
:Disp av,"     ∣     ",b
:Disp "           ∣————"
:
:
:result:=intDiv(av,b)
:a:=av
:ap:=string(a)
:ind:=0
:
:
:Loop
:If a<b Then
:  Exit
:EndIf
:ach:=string(a)
:dimach:=dim(ach)
:a:=int(av*10^(−(floor(log(a,10))+ind)))
:ind:=ind+1
:Disp a
:Disp "-    ",b*intDiv(a,b)
:Disp "——————"
:Disp remain(a,b)
:a:=int(av*10^(−(floor(log(av,10))+ind)))
:Disp a
:If a<b Then
:  Exit
:EndIf
:EndLoop
:EndPrgm

mais, ce que je veux faire ne marche toujours pas...

Je ré-explique :
une division euclidienne se fait en 3 étapes répétées successivement :
- on écrit le début du nombre à diviser
- on regarde cmb de fois le diviseur passe dans ce début (notons ce nombre a), et on soustrait au nombre de la première étape le produit du diviseur par a.
- on abaisse un chiffre de plus du dividende à coté du reste de cette première mini division, et on répète les étapes jusqu'à ce que tous les chiffres soient abaissés.

Le quotient est la suite des nombres a retrouvés à chaque étape.

La 3ème étape pose problème dans mon programme.


Edit :
je pense avoir trouvé une solution, en travaillant sur une liste plutôt que sur un nombre normal.
genre je crée ma liste comme ça :
Code: Select all
L:={}
Loop
  c:=remain(a,10)
  L:=augment(L,{c})
  a:=intDiv(a,10)
  If a=0 Then
    Exit
  EndIf
EndLoop

ce qui me permettra d'isoler facilement un des chiffres de a avec
Code: Select all
L[x]
x étant un indice qui augmente à chaque étape.
je fais ça et je reviens si ça marche pas.

Re: Division euclidienne

Unread postPosted: 16 Apr 2015, 13:31
by Bisam
Pour remédier à ton problème, tu peux abaisser tous les chiffres à chaque fois... ce n'est pas plus compliqué pour la division et c'est plus simple pour l'affichage.
Ensuite, tu oublies de prendre en compte la taille des nombres pour obtenir un affichage qui soit correct.

Re: Division euclidienne

Unread postPosted: 16 Apr 2015, 16:20
by Lu_Lu54
mais si on abaisse tout en même temps, ce n'est plus une division euclidienne dans les règles de l'art...
et le problème de la taille des nombres est un problème secondaire de mise en forme...

Re: Division euclidienne

Unread postPosted: 16 Apr 2015, 17:02
by Bisam
Mais le fait d'abaisser une partie ou bien tout.... c'est AUSSI de la mise en forme. Cela ne change rien aux calculs effectués.
Ou alors je n'ai pas compris ce que tu veux faire.

Tu peux faire un exemple sur papier ou en pdf ?

Re: Division euclidienne

Unread postPosted: 16 Apr 2015, 17:04
by Lu_Lu54
Je termine ce topic en vous donnant le lien de téléchargement :D

Merci à tous pour votre aide

Show/Hide spoilerAfficher/Masquer le spoiler
Bisam : c'est ça que je voulais :D