Другие языки программирования и технологии

Паскаль. Цикл While. Определить остаток от деления большего числа а на меньшее число b, не используя стандартные функции

program q170581016;
var
 a, b: integer;
begin
 Write('A = ');
 ReadLn(a);
 Write('B = ');
 ReadLn(b);
 while a >= b do
 begin
  a := a - b;
 end;
 WriteLn('a mod b = ', a);
 ReadLn;
end.

Тот-же алгоритм на асме (в Delphi писал. eax и ebx на ax и bx менять придётся, если Turbo Pascal)
asm
 push eax
 push ebx
 mov eax, a
 mov ebx, b
@_next:
 cmp eax, ebx
 jbe @_stop
 sub eax, ebx
 jmp @_next
@_stop:
 mov a, eax
 pop ebx
 pop eax
end;

Это конечно извращение стандартные функции дублировать xD

Полагаю, что предполагалось на асме DIV'ом остаток выделить, но это тоже самое что mod тогда выйдет, но идея заслуживает внимания.
Виктор Клименко
Виктор Клименко
83 540
Лучший ответ
Ну, если без только div и mod, то и while не нужен ;)

var a,b:real;
begin
write('a b: '); readln(a,b); writeln(trunc(a-b*trunc(a/b))); readln
end.

Хотя от вас ждут чего-то более глупого, вроде

var a,b,c:integer;
begin
write('a b: '); c:=0; readln(a,b); c:=0; while c<=a-b do c:=c+b; writeln(a-c); readln
end.
в цикле вычитаеием
Можно перебором

Program modder // Если хочеш

var a,o,b:integer; // Глобальные переменные.. . они в данной части не нужны но пусть будут (все равно рано или позно обявить прейдется)

function whiler(a,b):integer; //Наша главная функция

var c,i:integer; //Динамичные переменные

begin

while I<b do //Начали цикл (По факту это For )

begin

if int(a/b)*b+i=a then begin whiler:=i; break end; // проверяем правельность если да выводим ответ и выходим

i:=i+1; // Делаем шаг

end

end;



Begin // Начали

if a>b then o:=whiler(a,b) //Вводим в процидуру нужные пораметвы

else o:=whiler(b,a); //

write(o);// Выводи ответ

end.

Если можно без цикла то на прямую :=a-int(a/b)*b;

Надеюсь разберешся

P. S. Функция int Работает не во всех компиляторах, можно написать аналогичную, если что пиши.
YM
Yusif Mamedov
315