关于我90分然后不知到错哪里这件事情
查看原帖
关于我90分然后不知到错哪里这件事情
349713
灰的积雨云楼主2022/9/17 12:23

rt

第8个点没有过

说一下大致的思路:

ge()是高斯消元的函数

就是找到第一个系数不是0的式子,与第一个式子交换,成为消去后面式子的式子A

然后将A去消其他的式子

由于我不知道在这个函数内应该如何判断无解

我后面又写了一个用改判断无解的

如果一个式子的系数全部为0,那么无解

因为这里要求化简,这里还有一个化简的式子

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;

const int N = 110;
const double EPS = 1e-8;
typedef double M[N][N];
M m;
int n;

//选取式A(i),用它来消去剩下的式子
void ge()
{
	for (int i = 1; i <= n; ++ i)
	{
		for (int j = i; j <= n; ++ j)
		{
			if (fabs(m[j][i]) <= EPS) continue;
			for (int k = 1; k <= n + 1; ++ k) swap(m[i][k], m[j][k]);
		}
		for (int j = 1; j <= n; ++ j)
		{
			//j -> 即将消去的式子
			if (i == j) continue;
			double t = m[j][i] / m[i][i];
			for (int k = 1; k <= n + 1; ++ k) m[j][k] -= t * m[i][k]; 
		}
	}
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; ++ i)
		for (int j = 1; j <= n + 1; ++ j)
			scanf("%lf", &m[i][j]);
	ge();
	// for (int i = 1; i <= n; ++ i)
	// {
		// for (int j = 1; j <= n + 1; ++ j)
			// printf("%.2lf ", m[i][j]);
		// puts("");
	// }
	int cnt;
	for (int i = 1; i <= n; ++ i)
	{
		cnt = 0;
		for (int j = 1; j <= n; ++ j)
		{
			if (fabs(m[i][j]) <= EPS) ++ cnt;
			else m[i][n + 1] /= m[i][j];
		}
		if (cnt == n)
		{
			printf("No Solution\n");
			return 0;
		}
	}
	for (int i = 1; i <= n; ++ i)
		printf("%.2lf\n", m[i][n + 1]);
	return 0;
}

求大佬可以指点一下

2022/9/17 12:23
加载中...