高斯消元模板
【问题描述】
已知 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)
第一行,未知数的个数。以下n行n+1列:分别表示每一格方程的系数及方程右边的值。
n
a1,1a1,2…a1,nb1
a2,1a2,2…a2,nb2
…………
an,1an,2…an,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("\n");
}
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\n",i,0);
else printf("x%d=%.2lf\n",i,a[i][n+1]);
}
return 0;
}

浙公网安备 33010602011771号