Проанализируйте приведенную ниже процедуру вывода общего решения.
Procedure Diofant2 (a,b,c:Integer);
Var d,x,y,cd,bd,ad:Integer;
Begin
ExEuclid (abs(a),abs(b),d,x,y);1.5. Расширенный алгоритм Евклида 87
If c Mod d<>0 Then WriteLn('ɪɟɲɟɧɢɣ ɧɟɬ')
Else Begin
cd:=Abs(c) Div d;
x:=x*cd;
y:=y*cd;
bd:=Abs(b) Div d;
ad:=Abs(a) Div d;
If x>0 Then bd:=-bd Else ad:=-ad;
While Abs(x+bd)+Abs(y+ad) Do Begin
x:=x+bd;
y:=y+ad;
End;
If a<0 Then Begin x:=-x; bd:=-bd; End;
If b<0 Then Begin y:=-y; ad:=-ad; End;
If c<0 Then Begin
x:=-x; bd:=-bd;
y:=-y; ad:=-ad;
End;
WriteLn(x,' ',bd, '*k');
WriteLn(y,' ',ad, '*k');
End;
End;
** (* - любой из символов В или С)
*А*
ААА*АА*
АА*ААА*
А**
** (пока 6 вариантов)
Далее - аналогично:
**А
ААА*А*А
АА*АА*А
А*ААА*А
**А (ещё 5 вариантов)
ААА**АА
АА*А*АА
А*АА*АА
*ААА*АА (ещё 4 варианта)
АА**ААА
А*А*ААА
*АА*ААА (ещё 3 варианта)
А**
*А* (ещё 2)
** (ещё 1)
Итого: 6+5+4+3+2+1=21
Так как на месте * могут быть любые из 2 символов В или С, то это даст ещё по 4 варианта для каждого случая.
Можно здесь, конечно, комбинаторику вспомнить.
Итого: 21*4 = 84
function Avg(a:array[,] of integer):real;
begin
var s:=0; var k:=0;
foreach var e:integer in a do
if e>0 then begin s+=e; Inc(k) end;
if k>0 then Result:=s/k else Result:=1e-100;
end;
begin
var A:=MatrixRandom(4,4,-50,50); Writeln(A);
Writeln('Среднее арифметическое положительных равно ',Avg(A):0:3);
var B:=MatrixRandom(5,5,-30,30); Writeln(B);
Writeln('Среднее арифметическое положительных равно ',Avg(B):0:3);
var C:=MatrixRandom(4,5,-25,38); Writeln(C);
Writeln('Среднее арифметическое положительных равно ',Avg(C):0:3);
end.
Тестовое решение:
[[35,35,5,-47],[14,34,35,-13],[25,-5,35,-29],[-7,10,-12,12]]
Среднее арифметическое положительных равно 24.000
[[-12,-17,-10,19,14],[20,17,-27,-2,16],[-3,-21,30,2,10],[5,-3,-17,-3,18],[0,-26,29,1,-22]]
Среднее арифметическое положительных равно 15.083
[[-5,-11,17,-4,15],[15,17,-24,36,15],[-8,-3,-22,28,-25],[-21,6,12,31,-1]]
Среднее арифметическое положительных равно 19.200