莫欺少年穷,修仙之旅在这开始—>算法基础课题解
线性方程组
$$\begin{cases}a_{11}x_1+a_{12}x_2+…+a_{1n}x_n=b_1\\\\a_{21}x_1+a_{22}x_2+…+a_{2n}x_n=b_2\\\\\quad\vdots\qquad\vdots\qquad\qquad\quad\vdots\qquad\vdots\\\\a_{n1}x_1+a_{n2}x_2+…+a_{nn}x_n=b_n\end{cases}$$
增广矩阵
$$\begin{pmatrix}a_{11}&a_{12}&…&a_{1n}&b_1\\\\a_{21}&a_{22}&…&a_{2n}&b_2\\\\\vdots&\vdots&\vdots&\vdots&\vdots\\\\a_{n1}&a_{n2}&…&a_{nn}&b_n\end{pmatrix}$$
目标矩阵
$$\begin{pmatrix}1&0&…&0&x_1\\\\0&1&…&0&x_2\\\\\vdots&\vdots&\vdots&\vdots&\vdots\\\\0&0&…&1&x_n\end{pmatrix}$$
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
const double eps = 1e-8;
int n;
double a[N][N];
int gauss()
{
//枚举每一列
int r,c;
for(r=0,c=0;c<n;c++)
{
//找到当前列绝对值最大的行
int t=r;
for(int i=r+1;i<n;i++)
if(fabs(a[i][c])>fabs(a[t][c]))
t=i;
//当前列的最大行是 0,就没有必要再计算下去了
if(fabs(a[t][c])<eps) continue;
//让最大行和当前还未确定的行交换
for(int i=c;i<=n;i++) swap(a[r][i],a[t][i]);
//让当前行的当前列上的数字变为 1
for(int i=n;i>=c;i--) a[r][i]/=a[r][c];
//让当前行后面的每一行的当前列都变为 0
for(int i=r+1;i<n;i++)
for(int j=n;j>=c;j--)
a[i][j]-=a[i][c]*a[r][j];
//当前行已确定,搞下一行
r++;
}
if(r<n)
{
for(int i=r;i<n;i++)
if(fabs(a[i][n])>eps)
return 2; //无解
return 1; //无数解
}
//从后往前求解 x1, x2, ..., xn
for(int i=n-1;i>=0;i--)
for(int j=i+1;j<n;j++)
a[i][n]-=a[i][j]*a[j][n];
return 0; //唯一解
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
cin>>a[i][j];
int t=gauss();
//唯一解
if(!t)
{
for(int i=0;i<n;i++)
if(fabs(a[i][n])<eps) puts("0.00");
else printf("%.2lf\n",a[i][n]);
}
//无数解
else if(t==1) cout<<"Infinite group solutions"<<endl;
//无解
else cout<<"No solution"<<endl;
return 0;
}