Algo pour faire la division entre 2 entier positifs sans MOD/DIV

Fermé
elkhadra Messages postés 9 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 26 décembre 2013 - Modifié par elkhadra le 29/11/2013 à 23:18
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 7 déc. 2013 à 11:04
Bonjour,

je veux un algo/programme qui permet de faire la division entre 2 entier positifs sans utiliser le DIV et le MOD (trouver le quotient de la division et son reste)

Merci

j'ai essayer avec cette algo mais j'ai un problème pour 24/2 j'obtiens qt=11.5 et reste=1:
 program division;
 uses wincrt;
 var x,y,i,reste:integer;
           qt:real;
  begin

  writeln('entre 2 nombre entier positifs');
   readln(x,y);

    if y>x then begin
                x:=x+y;
                y:=x-y;
                x:=x-y;
                end;
          
    if x=y then
                         begin
                            qt:=1;
                            reste:=0;
                         end;
   for i:=1 to x do
    begin
  
                if (x/i)=y then
                         begin
                            qt:=x/y;
                            reste:=0;
                         end
            else
                         begin
                            qt:=(x-1)/y;
                            reste:=1;
                         end;
           end;
      writeln('le quotient de la division est ',qt:0:2,' et le reste est ',reste);     
   end.

2 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
30 nov. 2013 à 10:40
Bonjour,

Heeu, le but est de se passer de la division ou bien de réellement éviter "div"? Car la fonction "/" est un div en virgule flottante, la division est donc toujours là...

Si l'idée est bien de se passer de la division, il ne reste plus qu'à compter le nombre d'occurrences de cette manière:

program division;
uses wincrt;
var x,y, qt:integer;
begin

writeln('entre 2 nombre entier positifs');
readln(x,y);

Qt:= 0;

// On calcule x/y par itération en comptant simplement le nombre de passages

While x >= y do
begin
Dec(x, y);
Inc(Qt);
end;

// x contient le reste et Qt le quotient.


writeln('le quotient de la division est ',qt,' et le reste est ', x);
end.
6
elkhadra Messages postés 9 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 26 décembre 2013
Modifié par elkhadra le 30/11/2013 à 15:18
j'ai trouver un autre programme en utilisant l'instruction de la partie entier d'un réel TRUNC
et contrairement a ton programme celui-ci marche bien avec les entiers négatifs , je veux dire que si on fait la division de -28 sur 3 il va dire que qt=-9 et reste=-1
mais dans ton prog il écrit qt=0 , reste=-28

voila le prgm:
program division;
uses wincrt;
var a,b,qt:integer;
r:real; { r est le reste de la division }

Begin
writeln('entrer 2 nombres entiers positifs a et b');
readln(a,b);

qt:=trunc(a/b); { le quotient est egale a la partie entier de a/b }
r:=((a/b)-trunc(a/b))*b; { le reste est egale a la diffirence entre a/b et la partie entier de a/b multiplier par le b }

writeln('le quotient est ',qt,' le reste est ',r:0:0);
End.
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 30/11/2013 à 16:27
Oui oui tout à fait, puisque tu demandais un programme divisant des entiers positifs seulement!

Et là ton résultat est juste bien sûr, mais je ne comprend pas le rapport avec l'énoncé? Il m'a semblé comprendre que tu voulais un programme effectuant une division sans utiliser la fonction de division, et donc par itération...
Or, ton programme ne fait rien d'autre que d'utiliser la division dans ce cas, non?
En fait au lieu d'utiliser "div" tu utilises sa version en virgule flottante qui s'écrit "/", et tu tronques le résultat, revenant à l'utilisation d'un "div" donc...
Ton programme revient strictement à ça:
program division;
uses wincrt;
var a,b,qt:integer;
r:integer; { r est le reste de la division }

Begin
writeln('entrer 2 nombres entiers positifs a et b');
readln(a,b);

qt:= a div b;
r:= a - qt*b; {ou a mod b, ça revient au même}

writeln('le quotient est ',qt,' le reste est ',r);
End.

Donc tu utilises ce que tu ne dois pas utiliser dans ton exercice!
Mets ton énoncé si tu veux, on sera fixé sur ce qui t'es demandé précisément...
0
elkhadra Messages postés 9 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 26 décembre 2013
6 déc. 2013 à 13:11
enfaite l'exercice Nous dit pas de ne pas utilisé la division mais plus tôt [ l'instruction DIV et MOD ] parce-que il est facile d'avoir la solution en utilisons ses derniers !

Merci a toi , mais j'ai pas encours compris le principe de l'itération !
0