#include <iostream>
using namespace std;
const int N = 200;
int n;
double ans[N], a[N][N];
//打印行列式
void Print()
{
for (int i = 0; i < n; i++)
{for (int j = 0;j < n + 1; j++)
cout << a[i][j] << " "; cout << endl;}
}
void Guass()
{
//找第k列中最大的元素
for (int i = 0; i < n; i++)
{
int r = i;
for (int j = i + 1; j < n; j++)
{
if (a[r][i] < a[j][i])r = j;
}
//交换行列
if (r != i)
for(int j = 0; j < n + 1; j++)swap(a[i][j],a[r][j]);
//消元
for (int k = i + 1; k < n; k++)
{
double base = a[k][i] / a[i][i];
for (int j = 0; j < n + 1; j++)
{
a[k][j] -= base * a[i][j];
}
}
//Print();
//cout << endl;
}
//判断是否有解
//无解 有一行行列式系数全为0 但常数项不为0
for (int i = 0; i < n; i++)
{
int cnt = 0;
for (int j = 0; j < n; j++)
{
if (a[i][j] == 0)cnt ++;
}
if (cnt == n && a[i][n]){
cout << "No Solution" << endl;
return ;
}
}
//无穷解 有一行全为0
int r = 0;
for (int i = 0; i < n; i++)
{
int cnt = 0;
for (int j = 0; j < n + 1; j++)
if (a[i][j] == 0)cnt ++;
if (cnt == n + 1)r++;
}
if (r){
cout << "No Solution" << endl;
//自由变元数
int num = n - r;
return;
}
//回带求解
for (int i = n - 1; i >= 0; i--)
{
double tmp = a[i][n];
for (int j = i + 1; j < n; j++)
{
if (a[i][j])tmp -= a[i][j] * ans[j];
}
ans[i] = tmp / a[i][i];
}
//输出答案
for (int i = 0; i < n; i++)
{
if (ans[i] != 0)printf("%.2lf\n", ans[i]);
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n + 1; j++)
cin >> a[i][j];
Guass();
return 0;
}
05-03
1238
03-27
1322
06-19