Program Symm_numb; {Программа поиска симметричных чисел, которые являются
частными от деления чисел, состоящих из 10 неповторяющихся цифр, и 9}
{16 апреля 2005 г.}
Uses CRT;
type TN = array [1..12] of Byte;
var
k, k1 : LongInt;
i, j, X, Y : Integer;
h : Byte;
NCount, NC9 : LongInt;
const
N : TN = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0);
Ndiv : TN = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
{Последний байт для накопления...}
Procedure View(__N : TN);
var
j1 : Word;
begin
for j1 := 1 to 10 do
Write(__N[j1]);
end;
Procedure Divide9;
var
i1 : Word;
_N : Extended;
begin
_N := 0;
for i1 := 9 downto 0 do
_N := _N*10 + 1.0*N[10-i1];
Ndiv[11] := Round(_N - Int(_N/9.0)*9.0);
_N := _N / 9;
{ ___N := _N;}
for i1 := 0 to 9 do
begin
Ndiv[10-i1] := Round(_N - Int(_N/10.0)*10.0);
_N := Int(_N / 10);
end;
end;
Function CheckDiv : Boolean;{Симметрично ли частное}
var
q : Word;
p : Boolean;
begin
p := True;
for q := 0 to 3 do
p := p and (Ndiv[q+2] = Ndiv[10-q]);
{q+1, q+2, q+3; q+2 ищет те, которые были нужны}
CheckDiv := p;
end;
begin
NCount := 0;
NC9 := 0;
asm
mov ax, 3
int 10h
end;
WriteLn;
i := 1;
j := 1;
k := 1;
Repeat
i := 10;
While N[i-1] > N[i] do dec(i);
j := i - 1;
h := N[j];
While N[i+1] > h do inc(i);
N[j] := N[i];
N[i] := h;
i :=j + 1;
k := 10;
While i < k do
begin
h := N[i];
N[i] := N[k];
N[k] := h;
inc(i);
dec(k)
end;
inc(NCount);
if NCount mod 3000 = 0 then
begin
X := WhereX;
Y := WhereY;
GotoXY(1, 1);
Write('NCount = ', NCount, ' NC9 = ', NC9, ' ');
GotoXY(X, Y);
end;
Divide9;
if CheckDiv then
begin
inc(NC9);
Write('Число /');
View(N);
{ Write(':', ___N:1:1);}
Write('/, частное от деления на 9 = ');
View(Ndiv);
WriteLn;
end;
if Keypressed then
if ReadKey = #27 then Break;
Until j = 0;
Write('Число перестановок: ', NCount);
WriteLn(', число найденных чисел: ', NC9);
end.
{
Function CheckDif : Boolean;
var
q, i : Word;
p, p1 : Boolean;
begin
p := True;
p1 := False;
for q := 0 to 9 do
begin
for i := 0 to 9 do
p1 := p1 or (N[i] = q);
p := p and p1;
p1 := False;
end;
CheckDif := p;
end;
Procedure _inc;
var
i : Word;
begin
inc(N[0]);
for i := 0 to 9 do
begin
if N[i] > 9 then
begin
inc(N[i+1]);
N[i] := 0;
end;
end;
end;
for k1 := 0 to 9 do
for k := 0 to 999999999 do
begin
_inc;
Divide9;
if k mod 100000 = 0 then
begin
X := WhereX;
Y := WhereY;
GotoXY(1, 1);
Write('k = ', k, ' ');
GotoXY(X, Y);
end;
if (Ndiv[10] = 0) and (CheckDiv) and (CheckDif) then
begin
Write('Число /');
View(N);
Write('/, частное от деления на 9 = ');
View(Ndiv);
WriteLn;
end;
end;
}