tips:
1.变换出上三角矩阵
2.行变换是对整行进行操作
/*
高斯消元
枚举每一列c
找到绝对值最大的那一行
将该行换到最上面(当前最上面)
将该行第一个数变成一
将下面所有行的第c列消成零
倒着推出答案
*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include<stdio.h>
using namespace std;
const int N = 110;
const double eps=1e-6;
int n;
double a[N][N];
int gauss(){
int c,r;//c表示当前列,r表示行
for(c=0, r=0; c<n; c++){
int t=r;
//找到当前列最大值所在的行号
for(int i=r; i<n; i++){
if(fabs(a[i][c]) > fabs(a[t][c]) )
t=i;
}
//如果当前列所有数为零,直接看下一列
if(fabs(a[t][c]) < eps ) continue;
//将当前列最大值所在行换到当前最上面
for(int i=c; i <= n; i++ ) swap(a[t][i],a[r][i]);
//倒着除,使该行第一个数变为1
for(int i=n; i >= c; i-- ) a[r][i] /= a[r][c];
//将下面所有行的第c列消成零
for(int i=r+1; i < n; i++ ){
if(fabs(a[i][c]) > eps){
for(int j=n; j >= c; j--){
a[i][j] -= a[r][j]*a[i][c];
}
}
}
r++;
}
//从线性方程组的角度讨论解的情况
//r=n,则所有未知元Xi都在,具有唯一解
//r<n,未知元个数小于n个,判断余下的方程左边是零,判断右边是否为非零常数,即出现0=c(非零),无解
if( r< n){
for(int i=r; i<n ;i++){
if(fabs(a[i][n]>eps))
return 2;//无解
}
return 1;//有无穷多组解
}
//主元系数为1,答案存在a[i][n]中
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];//第i行方程的值a[i][n]减去方程左边对应系数与已求解出的变量的乘积
}
}
return 0;//有唯一解
}
int main(){
cin >> n;
for( int i=0; i<n; i++){
for(int j=0; j<= n; j++){
cin>>a[i][j];
}
}
int t = gauss();
if(t==0){
for(int i=0; i<n; i++) printf("%.2lf\n",a[i][n]);
}
else if(t==1) puts("Infinite group solutions");
else puts("No solution");
return 0;
}