【模板】高斯消元法
模板题目。
本来以为高斯消元是一种什么特别高深特别难懂的算法,结果就是一个普普通通的加减消元。有点故弄玄虚的感觉,真是无论什么东西都要搞一个高大上的名字才行吗。
写法上也很简单。枚举每一个未知数的系数,考虑把它变成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;
}
一如既往,万事胜意