?? gaess3.pas
字號:
{完整版:無解,多解,唯一解}
const max=100;
var
a:array[1..max,1..max+1] of real;
x:array[1..max] of real;
n,pre:integer;
procedure init;
var i,j:integer;
begin
assign(input,'a4.in');reset(input);
readln(n);
for i:=1 to n do
for j:=1 to n+1 do read(a[i,j]);
close(input);
end;
procedure change(i,pre:integer);{一次消元:第i行,第pre列開始}
var j,k:integer;
tem:real;
begin
for j:=i+1 to n do
begin
tem:=a[j,pre]/a[i,pre];{乘數(shù)}
for k:=pre to n+1 do
a[j,k]:=a[j,k]-a[i,k]*tem;
end;
end;
function find(i:integer):integer;{返回第i行,第一個不為0的數(shù)所在的列,包括交換調(diào)整后}
var row,col,j,k:integer;
tem:real;
begin
row:=i;
for col:=pre+1{1} to n+1 do {從1開始較慢,從上次的pre下一列開始即可}
begin
for j:=i+1 to n do {找一個絕對值大的數(shù)}
if abs(a[j,col])>abs(a[row,col]) then row:=j;
if abs(a[row,col])>0 then {找到非0數(shù)}
begin
if row<>i then {交換行}
for k:=col to n+1 do
begin tem:=a[i,k];a[i,k]:=a[row,k];a[row,k]:=tem;end;
find:=col;
exit;
end;
end;
find:=0;{已無非0數(shù)}
end;
procedure xiaoyuan;
var i,j,k,row,col,found:integer;
tem:real;
begin
pre:=0;
for i:=1 to n-1 do
begin
pre:=find(i);
if pre=0 then exit;{已消元結(jié)束,后面全為0}
change(i,pre);
end;
end;
procedure juzhen;{輸出最后消元后的矩陣,以供檢驗}
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n+1 do write(a[i,j]:0:0,' ');writeln;end;
end;
procedure print(k:integer);
var i,j:integer;
begin
if k<>1 then begin writeln(k);exit;end;
x[n]:=a[n,n+1]/a[n,n];
for i:=n-1 downto 1 do
begin
for j:=i+1 to n do
a[i,n+1]:=a[i,n+1]-a[i,j]*x[j];
x[i]:=a[i,n+1]/a[i,i];
end;
for i:=1 to n do
writeln('x',i,'=',x[i]:0:2);
end;
procedure check;
var i:integer;
begin
i:=n;
while abs(a[i,n])<1e-10 do dec(i);{writeln(i); }
if i=n then print(1);{有唯一的解}
if (i<n)and(a[i+1,n+1]=0) then print(0);{無窮多組實數(shù)解}
if (i<n)and(a[i+1,n+1]<>0) then print(-1);{無解}
end;
BEGIN
init;
xiaoyuan;
juzhen;
check;
END.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -