Проанализируйте приведенную ниже процедуру вывода общего решения. В чем ее отличие от предложенной ранее?
Предложите свой вариант реализации алгоритма. Можно
ли в нем обойтись без цикла и некоторых условий для a, b
и c?
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; в Pascal
var
a:array[1..n,1..n] of integer;
b:array[1..n] of integer;
i,j,s:integer;
begin
Randomize;
writeln('Исходный массив:');
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(21);
write(a[i,j]:4);
end;
writeln;
end;
for i:=1 to n do
begin
s:=0;
for j:=1 to n do s:=s+a[i,j];
b[i]:=s;
end;
writeln('Полученный массив:');
for i:=1 to n do write(b[i]:4);
writeln;
end.
Пример:
Исходный массив:
8 12 16 16 19 15 11 11 13 7
7 3 20 3 13 2 20 18 9 2
18 11 17 0 4 0 18 3 17 12
12 9 18 9 18 4 7 15 4 20
17 12 13 20 12 20 4 10 16 18
15 19 2 1 18 20 13 1 19 3
12 7 8 13 3 3 15 13 2 15
15 0 20 9 20 14 3 19 6 20
12 4 19 0 19 2 18 4 12 10
3 7 5 15 15 3 19 9 10 8
Полученный массив:
128 97 100 116 142 111 91 126 100 94