===== PascalABC.NET =====
function GCD(a, b: integer): integer;// НОД
begin
while b <> 0 do
begin
a := a mod b;
Swap(a, b)
end;
Result := a
end;
procedure RedFrac(var a, b: integer);// сокращение дроби
begin
var sgna := Sign(a); // мы должны учитывать знак!
var sgnb := Sign(b); // мы должны учитывать знак!
a := Abs(a);
b := Abs(b);
var d := GCD(a, b);
a := (a div d) * sgna;
b := (b div d) * sgnb
end;
begin
var (p1, q1) :=
ReadInteger2('Дробь 1. Введите числитель и знаменатель:');
var (p2, q2) :=
ReadInteger2('Дробь 2. Введите числитель и знаменатель:');
var p3 := p1 * q1 + p2 * q2;
var q3 := q1 * q2;
RedFrac(p3, q3);
Println(p3, '/', q3)
end.
8388608/8=1048576 байт,
1048576/1024=1024 килобайта,
1024/1024=1 мегабайт.
Трудно сказать не видя структуры твоего калькулятора. Если у тебя два поля для ввода чисел (edit1 и edit2), а результат записываешь в Memo1 (кстати, а зачем именно тип Memo?), то можно сделать следующим образом (пример для кнопок "+" и "-")
procedure TForm1.PlusClick(Sender: TObject);
var x,y:real;
r:string;
begin
val(edit1.Text,x);
val(edit2.Text,y);
str(x+y,r);
Memo1.Lines[0]:=edit1.Text+'+'+edit2.Text+'='+r;
end;
procedure TForm1.MinusClick(Sender: TObject);
var x,y:real;
r:string;
begin
val(edit1.Text,x);
val(edit2.Text,y);
str(x-y,r);
Memo1.Lines[0]:=edit1.Text+'-'+edit2.Text+'='+r;
end;
Mod(23,10) = 3
div(23,10) = 2
3*10+2 = 32