题目背景
Gauss消元
题目描述
给定一个线性方程组,对其求解
输入输出格式
输入格式:
第一行,一个正整数n
第二至n+1行,每行n+1个整数,为a1,a2…an和b,代表一组方程。
输出格式:
共n行,每行一个数,第i行为xi (保留2位小数)
如果不存在唯一解,在第一行输出”No Solution”.
输入输出样例
输入样例#1:
1
1 1
输出样例#1:
1.00
说明
1<=n<=100, |ai|<=10000, |b|<=10000
分析:
模版题,直接打就好了
代码:
var
matrix:array [1..500,1..500] of extended;
r,ans:array [1..500] of extended;
n,m,i,j,x,y:longint;
procedure find(x:longint);
var i,tx,j:longint;
t,max:extended;
begin
max:=-1; tx:=0;
for i:=x to n do
begin
if abs(matrix[i,x])>max then
begin max:=abs(matrix[i,x]); tx:=i; end;
end;
for j:=x to n do
begin
t:=matrix[tx,j]; matrix[tx,j]:=matrix[x,j]; matrix[x,j]:=t;
end;
t:=r[x]; r[x]:=r[tx]; r[tx]:=t;
end;
procedure gauss;
var i,j,k:longint;
x,q:extended;
begin
for j:=1 to n do
begin
find(j);
for i:=j+1 to n do
begin
q:=matrix[j,j]/matrix[i,j];
for k:=j to n do
matrix[i,k]:=matrix[i,k]*q-matrix[j,k];
r[i]:=r[i]*q-r[j];
end;
end;
for j:=n downto 1 do
begin
x:=r[j];
for k:=j+1 to n do
x:=x-ans[k]*matrix[j,k];
if matrix[j,j]=0 then
begin
writeln('No Solution');
halt;
end;
ans[j]:=x/matrix[j,j];
end;
end;
begin
read(n);
for i:=1 to n do
begin
for j:=1 to n do
read(matrix[i,j]);
read(r[i]);
end;
gauss;
for i:=1 to n do
writeln(ans[i]:0:2);
end.