Добрый день, джентельмены.
Есть 2 задачи, которые написаны на Паскале и которые нужно оформить в Делфи.
1. Проверить, делится ли данное ОченьДлинноеЦелое на 11 (использовать признак делимости). Вывести результат,если признак делимости выполняется. (В Делфи нужно сделать так, вводимое в эдит число проверялось по условию по нажатию на кнопку и выводился ответ. Во второй задаче просто кнопка проверить и, возможно, как нибудь вывести значения сравниваемых чисел)
Код задачи.
Код:
//---------------------------------------------------------
// Задача 1
// Алгоритм использует следующее равенство
// (10^(n-1)*x[0] + 10^(n-2)*x[1] + ... + 10*x[n-2] + x[n-1])*11 =
// 10^n*x[0] + 10^(n-1)*(x[1] + x[0]) + ... + 10*(x[n-1] + x[n-2]) + x[n-1] =
// 10^n*z[0] + 10^(n-1)*z[1] + ... + 10*z[n-1] + z[n],
// откуда прежде всего следует, что x[n-1] = z[n].
// Далее (x[n-1] + x[n-2]) mod 10 = z[n-1].
// Если ((a+b) mod 10) = с > a, то это означает, что a+b < 10 и наоборот
// если ((a+b) mod 10) = с < a, то a+b > 10 (например (4+3) mod 10 = 7,
// (4+8) mod 10 = 2). Т.е., если x[n-1] < z[n-1], то x[n-2] = z[n-1] - x[n-1],
// в противном случае x[n-2] = z[n-1] + 10 - x[n-1] и при этом еще
// 1 перейдет на следующий шаг. Ну и так далее.
// в функции z - делимое, x - результат.
// --------------------------------------------------------
function qoutient_11(z : String; var x : String) : integer;
var
n, i, j, x0, x1, d : Integer;
w : array[1..256] of char;
begin
n := length(z);
x0 := 0;
i := 1;
while i <= n do // Сумма цифр на нечетных позициях
begin
x0 := x0 + Ord(z[i]) - Ord('0');
Inc(i, 2);
end;
x1 := 0;
i := 2;
while i <= n do // Сумма цифр на четных позициях
begin
x1 := x1 + Ord(z[i]) - Ord('0');
Inc(i, 2);
end;
if (x1 - x0) mod 11 <> 0 then // Проверка признака делимости на 11:
begin // разность x1 - x0 должна делиться на 11.
qoutient_11 := 0;
exit;
end;
j := n - 1;
i := j;
d := 0;
w[i] := z[n];
while j > 1 do
begin
Dec(j);
if Ord(w[i]) + d < Ord(z[i]) then
begin
w[j] := Chr(Ord(z[i])- Ord(w[i]) - d + Ord('0'));
d := 0;
end
else
begin
w[j] := Chr((Ord(z[i]) + 10) - Ord(w[i]) - d + Ord('0'));
d := 1;
end;
i := j;
end;
for i:=1 to n - 1 do
x := x + w[i];
qoutient_11 := 1;
end;
и
2. Вычесть КороткоеЦелое из ОДЦ.
Код:
// -----------------------------------------------------
// Задача 2
// x - y = z
//-----------------------------------------------------
function difference(x : String; y: String; var z: String): integer;
var
nx, ny, ix, iy, d: Integer;
w : Array[1..256] of Char;
error : boolean;
begin
nx := length(x);
ny := length(y);
error := false; // проверка того, что x > y
if nx < ny then
error := true
else
if nx = ny then
begin
ix := 1;
while ix <= nx do
begin
if Ord(x[ix]) > Ord(y[ix]) then
break;
Inc(ix);
end;
if ix > nx then
error := true;
end;
if error then
begin
difference := 0; // x < y - выходим из функции
exit;
end;
ix := nx; // Далее идет вычитание "столбиком"
iy := ny;
d := 0;
while iy > 0 do
begin
if Ord(y[iy]) + d <= Ord(x[ix]) then
begin
w[ix] := Chr(Ord(x[ix]) - Ord(y[iy]) - d + Ord('0'));
d := 0;
end
else
begin
w[ix] := Chr((Ord(x[ix]) + 10) - Ord(y[iy]) - d + Ord('0'));
d := 1;
end;
Dec(ix);
Dec(iy);
end;
while ix > 0 do
begin
if d <= Ord(x[ix]) - Ord('0') then
begin
w[ix] := Chr(Ord(x[ix]) - d);
d := 0;
end
else
begin
w[ix] := Chr((Ord(x[ix]) + 10) - d);
d := 1;
end;
Dec(ix);
end;
ix := 1;
while w[ix] = '0' do
inc(ix);
z := '';
while ix <= nx do
begin
z := z + w[ix];
Inc(ix);
end;
difference := 1;
end;
Пожалуйста, помогите переоформить этот код под Делфи!