首页 > 其他 > 详细

高斯消元板子

时间:2021-05-10 20:04:31      阅读:22      评论:0      收藏:0      [点我收藏+]
#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;
}

高斯消元板子

原文:https://www.cnblogs.com/WindZR/p/14752134.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!