Const max_n = 4; Type matrix = Array[1 .. max_n, 1 .. max_n] Of real; Const a: matrix = ((2, 9, 9, 4), (2, -3, 12, 8), (4, 8, 3, -5), (1, 2, 6, 4)); function minusOne(n: integer): integer; begin minusOne := (1 - 2*Byte(Odd(n))); end; function get_addr(i, j: integer; const n: integer): integer; begin get_addr := pred(i) * n + j end; Function det(Var p; Const n: integer): real; Type matrix = Array[1 .. max_n * max_n] Of real; Var my_p: matrix Absolute p; pp: ^matrix; s: real; i, j, curr: integer; Begin s := 0.0; If n = 2 Then Begin det := my_p[1]*my_p[4] - my_p[2]*my_p[3]; exit End; For i := 1 To n Do Begin GetMem(pp, Sqr(Pred(n)) * SizeOf(real)); curr := 1; For j := 1 To n Do If j <> i Then Begin move(my_p[get_addr(j, 2, n)], pp^[get_addr(curr, 1, Pred(n))], pred(n) * SizeOf(real)); inc(curr); End; s := s + minusOne(Succ(i)) * my_p[get_addr(i, 1, n)] * det(pp^, Pred(n)); FreeMem(pp, Sqr(Pred(n)) * SizeOf(real)) End; det := s End; begin WriteLn( det(a, 4):0:0 ); end.