高斯消元

#include<bits/stdc++.h>
using namespace std;
long long n,top,mp[1010],record[1010];
double a[1010][1010],ans[1010];
int main()
{
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++)
	{
		mp[i]=i;
		for(long long j=1;j<=n+1;j++)
		{
			cin>>a[i][j];
		}
	}
	top=n;
	for(long long i=n;i>1;i--)
	{
		long long who=0;
		for(long long j=1;j<=top;j++)
		{
			if(who)
			{
				mp[j-1]=mp[j];
			}
			else if(a[mp[j]][i]!=0)
			{
				who=mp[j];
				record[i]=who;
			}
		}
		if(who) top--;
		else continue;
		for(long long j=1;j<=top;j++)
		{
			double cha=a[mp[j]][i]/a[who][i];
			a[mp[j]][i]=0;
			for(long long l=1;l<i;l++)
			{
				a[mp[j]][l]-=cha*a[who][l];
			}
			a[mp[j]][n+1]-=cha*a[who][n+1];
		}
	}
	if(a[mp[1]][1]==0)
	{
		puts("Impossible!");
		return 0;
	}
	ans[1]=a[mp[1]][n+1]/a[mp[1]][1];
	for(long long i=2;i<=top;i++)
	{
		if(a[mp[i]][n+1]/a[mp[1]][1]!=ans[1])
		{
			puts("Impossible!");
			return 0;
		}
	}
	printf("x1=%0.5lf\n",ans[1]);
	for(long long i=2;i<=n;i++)
	{
		if(record[i])
		{
			double pre=0;
			for(long long j=1;j<i;j++)
			{
				pre+=a[record[i]][j]*ans[j];
			}
			ans[i]=(a[record[i]][n+1]-pre)/a[record[i]][i];
			printf("x%lld=%0.5lf\n",i,ans[i]);
		}
		else
		{
			printf("x%lld=any number\n",i);
		}
	}
} 
posted @ 2025-10-19 11:56  gw2381  阅读(2)  评论(0)    收藏  举报