高斯消元模板

【问题描述】
已知 n 元线性一次方程组。
a1,1x1+a1,2x2++a1,nxn=b1
a2,1x1+a2,2x2++a2,nxn=b2
………………
an,1x1+an,2x2++an,nxn=bn
其中: n<=50.系数是整数,绝对值<=100 , bi的值都是正整数且<300
编程任务:
根据输入的数据,编程输出方程组的解的情况。
【输入】(gaess.in)
第一行,未知数的个数。以下nn+1列:分别表示每一格方程的系数及方程右边的值。
n
a1,1a1,2a1,nb1
a2,1a2,2a2,nb2
…………
an,1an,2an,nbn
【输出】(gaess.out)
如果方程组无实数解输出1 ;
如果有无穷多实数解,输出 0 ;
如果有唯一解,则输出解(小数点后保留两位小数,如果解是0,则不保留小数)
【样例输入】
3
2 -1 1 1
4 1 -1 5
1 1 1 0
【样例输出】

x1=1.00

x2=0

x3=-1.00

#include<bits/stdc++.h>
#define ll long long
#define DB double
#define eps 1e-8 
using namespace std;
inline int read()
{
	int x=0,w=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
	while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*w;
}
const int N=120;
int n;
DB a[N][N];
//-1 无解  0 0 0 9
//0 多解   右上三角矩阵中不完全为1 
//1  唯一解
void debug()
{
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n+1;++j)
		 printf("%.2lf ",a[i][j]);
		printf("
");
	}
	cout<<"_________________"<<endl;
}
int gaosi()
{
	for(int i=1;i<=n;++i)
	{
		int nw=i; 
		for(int j=i+1;j<=n;++j)
		 if(fabs(a[nw][i])<fabs(a[j][i])) nw=j;
		swap(a[nw],a[i]);
		if(fabs(a[i][i])<eps) continue;
		DB h=a[i][i];
		for(int j=i;j<=n+1;++j) a[i][j]/=h;
		for(int j=1;j<=n;++j)
		 if(j!=i)
		 {
			DB zz=a[j][i];
			for(int k=1;k<=n+1;++k) a[j][k]-=zz*a[i][k];
		 }
	}
	//判断解 
	int opt1=0,opt2=0;
	for(int i=1;i<=n;i++){
        int j=1;
        while(fabs(a[i][j])<eps&&j<=n+1)j++;
        if(j>n+1) opt1=1;//多解 
        else if(j==n+1)opt2=1;//无解 
    }
    if(opt2) return -1;
	if(opt1) return 0; 
	return 1;
} 
int main()
{
	freopen("gaess.in","r",stdin);
	freopen("gaess.out","w",stdout); 
    n=read();
    for(int i=1;i<=n;++i)
     for(int j=1;j<=n+1;++j)
      a[i][j]=(DB)read();
    int fg=gaosi();
//    debug();
    if(fg==-1) cout<<"-1";
    else if(fg==0) cout<<"0";
    else{
    	for(int i=1;i<=n;++i) 
    	if(a[i][n+1]==0)  printf("x%d=%d
",i,0);
		else  printf("x%d=%.2lf
",i,a[i][n+1]);
    }
	return 0;
}

  

原文地址:https://www.cnblogs.com/adelalove/p/8609373.html