【模板】高斯消元法

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 @   Feyn618  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示