高斯消元初探。。。。

嘛,这个东西是拿来做一些恶心的题的。。。。

本质思想是按层次处理。。。
第一层,把所有第一个未知元给消去。。

依次往后。。。。

然后对于无解情况的判定。。。。
当一列全是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.唯一性
差不多了吧

发布了80 篇原创文章 · 获赞 3 · 访问量 1748

猜你喜欢

转载自blog.csdn.net/qq_41567618/article/details/104780798