Starrydream @ 2018-10-24 11:02:21
判断无解或者无穷解的原理不是当前行其他元都带入消掉后看看形如ax=b这种分类讨论下吗。。 以下是我的代码
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#define maxn 555
const double eps = 1e-8;
double A[maxn][maxn];
bool flag;
int n ;
void Gauss() {
for(int i = 0; i < n; i ++) {//for each row(varieble)
int r = i;
for(int j = i + 1; j < n; j ++)
if(fabs(A[j][i]) > fabs(A[r][i])) r = j;
if(r != i) for(int j = 0; j <= n; j ++) std :: swap(A[r][j], A[i][j]);
if(fabs(A[i][i]) < eps) continue;
for(int j = n; j >= i; j --) {
for(int k = i + 1; k < n; k ++)
A[k][j] -= A[k][i] / A[i][i] * A[i][j];
}
}
//
for(int i = 0 ; i < n ; ++i)
{
bool IF = false , ALL = false;
for(int j = 0 ; j < n ; ++j)
if(fabs(A[i][j]) > eps)
IF = true;
if(fabs(A[i][n]) > eps)
ALL = true;
if(!IF){
if(!ALL) {
puts("0"); flag = true; return;
}
else {
puts("-1") ; flag = true ; return;
}
}
}
for(int i = n - 1; i >= 0; i --) {
for(int j = i + 1; j < n; j ++){
A[i][n] -= A[j][n] * A[i][j];
}
if(fabs(A[i][i]) < eps){
if(fabs(A[i][n]) < eps){
puts("0") , flag = true;
return;
}
else if(fabs(A[i][n]) > eps){//ax = b
puts("-1") , flag = true;
return;
}
}
A[i][n] /= A[i][i];
}
}
int main()
{
scanf("%d",&n);
for(int i = 0 ; i < n ; ++i)
for(int j = 0 ; j <= n ; ++j)
scanf("%lf",&A[i][j]);
Gauss();
if(flag) return 0;
for(int i = 0 ; i < n ; ++i)
printf("x%d=%.2lf\n",i+1,A[i][n]);
}