MnZn刚学高斯消元1ms 求助
查看原帖
MnZn刚学高斯消元1ms 求助
540177
wyf_sinon楼主2024/1/4 19:30

pts80+hack2WA 求助

其中会输出-0???

#include<bits/stdc++.h>
using namespace std;
#define DB double 
const int N=105;
DB a[N][N],b[N];
DB eps=1e-7;
int n;
void ct()//方便调试
{
		for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
		cout<<b[i];
		puts("");
	}
	return ;
}
signed main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
		scanf("%lf",&b[i]);
	}
	bool flag = true;
	for(int i=1;i<=n;i++) // 解出xi并消去剩余xi的系数
	{
		bool f = false;
		for(int j=i;j<=n;j++)
		{
			if(fabs(a[j][i])>eps) //找到一个xi系数不为0的方程
			{
				for(int k=1;k<=n;k++) swap(a[i][k],a[j][k]);
				swap(b[i],b[j]); 
				f=true; 
			}
		}
		if(f) flag=false; //xi多解
		for(int j=1;j<=n;j++)
		{
			if(i==j) continue;
			DB rate=a[j][i]/a[i][i];
			for(int k=i;k<=n;k++)
				a[j][k]-=a[i][k]*rate;
			b[j]-=b[i]*rate;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(fabs(a[i][i])<eps&&fabs(b[i])>eps)
		{
			puts("-1"); //无解
			exit(0);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j) continue;
			if(fabs(a[i][j])>eps) 
			{
				printf("0"); //多元即多解
				exit(0);
			}
		}
	}
	if(flag)
	{
		printf("0"); 
		exit(0);     
	}
	for(int i=1;i<=n;i++) 
		printf("x%d=%.2f\n", i , b[i]/a[i][i] );
	return 0;
}
2024/1/4 19:30
加载中...