高斯消元板子

1.可以判断有无解

#include<bits/stdc++.h>
#define re register int
#define D double
using namespace std;
int n,J;
D a[600][600],x[600];
void solve()
{
	int h=1,l=1;
	for(;(h<=n)&&(l<=n);h++,l++)
	{
		int maxx=h;
		for(re j=h+1;j<=n;j++)
			if(fabs(a[j][l])>fabs(a[maxx][l]))
				maxx=j;
		if(maxx!=h)
			swap(a[h],a[maxx]);
		if(!a[h][l])
		{
			--h;
			continue;
		}
		for(re j=h+1;j<=n;j++)
		{
			D tem=a[j][l]/a[h][l];
			for(re k=l;k<=n+1;k++)
				a[j][k]-=a[h][k]*tem;
		}
	}
	for(re i=h;i<=n;i++)
		if(a[i][n+1]!=0)
		{
			J=-1;
			return;
		}
	if(h<=n)
		J=-2;
}
int main()
{
	scanf("%d",&n);
	for(re i=1;i<=n;i++)
		for(re j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	solve();
	if(J==-1)
	{
		printf("-1\n");
		return 0;
	}
	if(J==-2)
	{
		printf("0\n");
		return 0;
	}
	for(re i=n;i>0;i--)
	{
		D ans=a[i][n+1];
		for(re j=n;j>i;j--)
			ans-=a[i][j]*x[j];
		x[i]=ans/a[i][i];
	}
	for(re i=1;i<=n;i++)
	{
		if(x[i]==0)
			printf("x%d=0\n",i);
		else
			printf("x%d=%.2lf\n",i,x[i]);
	}
	return 0;
}

2.相对简单,但不能判断无解



#include<bits/stdc++.h>
#define re register int
#define D double
using namespace std;
int n,J;
D a[600][600];
void solve()
{
	for(re i=1;i<=n;i++)
	{
		int maxx=i;
		for(re j=i+1;j<=n;j++)
		{
			if(fabs(a[j][i])>fabs(a[maxx][i]))
				maxx=j;
		}
		if(maxx!=i)
			swap(a[i],a[maxx]);
		for(re j=1;j<=n;j++)
		{
			if(j==i)
				continue;
			D tem;
			if(!a[i][i])
				tem=0;
			else
				tem=a[j][i]/a[i][i];
			for(re k=i+1;k<=n+1;k++)
				a[j][k]-=a[i][k]*tem;
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(re i=1;i<=n;i++)
		for(re j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	solve();
	for(re i=1;i<=n;i++)
	{
		D ans=a[i][n+1]/a[i][i];
		if(ans==0)
			printf("x%d=0\n",i);
		else
			printf("x%d=%.2lf\n",i,ans);
	}
	return 0;
}
posted @ 2021-05-11 15:37  WindZR  阅读(53)  评论(0编辑  收藏  举报