【模板】高斯消元法

link

模板题目。

本来以为高斯消元是一种什么特别高深特别难懂的算法,结果就是一个普普通通的加减消元。有点故弄玄虚的感觉,真是无论什么东西都要搞一个高大上的名字才行吗。

写法上也很简单。枚举每一个未知数的系数,考虑把它变成1,同时把其它行的相应位置变成0即可。实现上有些细节,不多说。

另外可以想到若某一行前面N个数均为0,要么是无解,要么是无数解,在本题中都要输出无解。

#include<cstdio>
//#define zczc
const int N=105;
const double eps=1e-6;
inline void read(int &wh){
    wh=0;int f=1;char w=getchar();
    while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
    while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
    wh*=f;return;
}
inline double abs(double wh){return wh<0?-wh:wh;}
inline double swap(double s1,double s2){double s3=s1;s1=s2;s2=s3;}

int m;double a[N][N];


signed main(){
	
	#ifdef zczc
	freopen("in.txt","r",stdin);
	#endif
	
	read(m);
	for(int i=0;i<m;i++)
		for(int j=0;j<=m;j++)
			scanf("%lf",&a[i][j]);
	for(int i=0;i<m;i++){
		int s=i;
		for(int j=i+1;j<=m;j++)
			if(abs(a[s][i])<abs(a[j][i]))s=j;
		if(abs(a[s][i])<eps)return printf("No Solution"),0; 
		if(s!=i)for(int j=i;j<=m;j++)swap(a[i][j],a[s][j]);
		double temp=a[i][i];
		for(int j=i;j<=m;j++)a[i][j]/=temp;
		for(int j=0;j<m;j++){
			if(j==i)continue;temp=a[j][i];
			for(int k=i;k<=m;k++)a[j][k]-=temp*a[i][k];
		}
	}
	for(int i=0;i<m;i++)printf("%.2f\n",a[i][m]);
	
	return 0;
}
posted @ 2022-02-19 17:01  Feyn618  阅读(25)  评论(0编辑  收藏  举报