高斯消元80ptsWA#8#9#12#13求Debug(都是无解->无穷多解)
查看原帖
高斯消元80ptsWA#8#9#12#13求Debug(都是无解->无穷多解)
743373
Vitamin_B楼主2024/3/12 14:02

以下是注释版代码:

# include <bits/stdc++.h>

# define ffor(i,name) \
	for (auto i = name.begin (); i != name.end (); ++ i)

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

const double eps = 1e-7;

int n, sum, m;

double a[105][105], x[105], mul;

int main () {

//	ios::sync_with_stdio (0);
//
//	cin.tie (0);
//
//	cout.tie (0);

	cin >> n;

	m = n + 1;

	for (int i = 1; i < m; ++ i)
		for (int j = 1; j <= m; ++ j)
			cin >> a[i][j];

	for (int i = 1; i < n; ++ i) {

		if (fabs (a[i][i]) <= eps) //当前是0
			for (int j = i + 1; j < m; ++ j)
				if (fabs (a[j][i]) > eps) { //抓一个>0的来交换

					swap (a[i], a[j]);

					break ;

				}

		if (fabs (a[i][i]) <= eps) //整列都是0
			continue ;

		for (int j = i + 1; j < m; ++ j) {

			mul = a[j][i] / a[i][i];

			for (int k = i + 1; k <= m; ++ k)
				a[j][k] -= mul * a[i][k];

		}

	}

	for (int i = n; i; -- i) {

		for (int j = i + 1; j < m; ++ j)
			a[i][m] -= a[i][j] * x[j];

		if (fabs (a[i][i]) <= eps) {

			if (fabs (a[i][m]) <= eps) //0*x[i]=0,无穷多解
				putchar ('0');
			else //0*x[i]≠0,无解
				puts ("-1");

			return 0;

		}

		x[i] = a[i][m] / a[i][i];

	}

	for (int i = 1; i <= n; ++ i)
		printf ("x%d=%.2lf\n", i, x[i]);

	return 0;

}
/*
3
1 1 3 4
2 2 3 1
2 1 1 1
*/
2024/3/12 14:02
加载中...