嘛,这个东西是拿来做一些恶心的题的。。。。
本质思想是按层次处理。。。
第一层,把所有第一个未知元给消去。。
依次往后。。。。
然后对于无解情况的判定。。。。
当一列全是0,就是已经被消完了。。。。
那此时这个元可以为任意数。。。
就无解?
我是这么理解的。。。
#include<bits/stdc++.h>
#define MAXN 105
using namespace std;
int n;
double a[MAXN][MAXN];
void init(){
cin>>n;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= n + 1 ; j++)
cin>>a[i][j];
}
void solve(){
for(int i = 1 ; i <= n ; i++){
/*for(int j=1;j<=n;j++){
for(int k=1;k<=n+1;k++){
cout<<a[j][k]<<" ";
}
cout<<endl;
}
cout<<endl;*/
int jl = i;
while(a[jl][i] == 0 && jl <= n)jl++;
if(jl > n){cout<<"No Solution"<<endl;exit(0);}
for(int j = 1 ; j <= n + 1 ; j++)swap(a[i][j] , a[jl][j]);
double g = a[i][i];
for(int j = 1 ; j <= n + 1 ; j++)a[i][j]/=g;
for(int j = 1 ; j <= n ; j++){
if(j == i)continue;
double p = a[j][i];
for(int k = 1; k <= n + 1 ; k++){
a[j][k] -= p * a[i][k];
}
}
}
for(int i=1;i<=n;i++){
if(a[i][n + 1] >= 0)printf("%.2f\n",a[i][n + 1]);
else printf("%.2f\n",a[i][n + 1]);
}
}
int main(){
init();
solve();
}
嘛,本质上是就基向量。。。。
然后好像 在不同的运算规则向也可以套用这种思路
概括一下就是有:
1.可消性
2.主元独立性?
3.唯一性
差不多了吧