B
BullDogg unregisteredАвтор темы
Вот код процедуры. При стандартных настройках Паскаля переполнение стека происходит при N=88, если поставить максимально возможный стек (Options -> Memory sizes... -> Stack Size), тогда результаты можно получать до N=180.
program msquares;
uses crt;
const mn=88
var p:boolean;
f_in,f_out:text;
er1,n:integer;
Sk:real;
procedure magic_square(n:longint);
var i,j,k,s,t,b,r,m:integer;
a:array[1..mn,1..mn] of integer;
begin
p:=true; {default value}
if n>mn then
begin
writeln('Slishkom bolshoi parametr!');
exit
end;
if n mod 2=1 then {n neparnoje chislo}
begin
writeln('Nevernij parametr');
exit
end
else
if n mod 4=0 then
begin k:=1;
for i:=1 to n do
for j:=1 to n do
begin a[i,j]:=k; inc(k)
end;
j:=2; m:=n div 2;
for i:=1 to m do
for k:=1 to m div 2 do
begin if j=m+1 then j:=2 else
if j=m+2 then j:=1;
s:=n-i+1; b:=n-j+1;
t:=a[i,j]; a[i,j]:=a[s,b]; a[s,b]:=t;
t:=a[i,b]; a[i,b]:=a[s,j]; a[s,j]:=t;
j:=j+2;
end;
end
else if n<>2 then
begin k:=1;
for i:=1 to n do
for j:=1 to n do
begin a[i,j]:=k; inc(k)
end;
r:=(n div 2 -1) div 2; m:=n div 2;
{1st type change}
for i:=1 to m do
begin j:=i;
for k:=1 to r do
begin if j>m then j:=1;
s:=n-i+1; b:=n-j+1;
t:=a[i,j]; a[i,j]:=a[s,b]; a[s,b]:=t;
t:=a[i,b]; a[i,b]:=a[s,j]; a[s,j]:=t;
inc(j)
end;
end;
{2nd type change}
i:=1; j:=r+1;
for k :=1 to m do
begin if j>m then j:=1;
s:=n-i+1; t:=a[i,j];
a[i,j]:=a[s,j]; a[s,j]:=t;
inc(i); inc(j)
end;
{3rd type change}
i:=1; j:=r+2;
for k:=1 to m do
begin if j>m then j:=1;
b:=n-j+1;
t:=a[i,j]; a[i,j]:=a[i,b]; a[i,b]:=t;
inc(i); inc(j)
end;
end else p:=false;
if p then
begin
Sk:= ( (1+(n*n))*n )/2;
writeln(f_out,'Magicheskaja summa: ',Sk:3:0);
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
end;
end else
begin
writeln('Magicheskij kvadrat so storonoi 2 ne suschestvujet!');
end
end;