高斯消元

高斯消元

高斯消元解线性方程组

输入一个包含 nn 个方程 nn 个未知数的线性方程组。

方程组中的系数为实数。

求解这个方程组。

下图为一个包含 mm 个方程 nn 个未知数的线性方程组示例:

高斯消元

输入格式

第一行包含整数 nn。

接下来 nn 行,每行包含 n+1n+1 个实数,表示一个方程的 nn 个系数以及等号右侧的常数。

输出格式

如果给定线性方程组存在唯一解,则输出共 nn 行,其中第 ii 行输出第 ii 个未知数的解,结果保留两位小数。

如果给定线性方程组存在无数解,则输出 Infinite group solutions

如果给定线性方程组无解,则输出 No solution

数据范围

1≤n≤1001≤n≤100,
所有输入系数以及常数均保留两位小数,绝对值均不超过 100100。

输入样例:

3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00

输出样例:

1.00
-2.00
3.00

高斯消元

高斯消元

高斯消元

#include <iostream>
#include <algorithm>

using namespace std;

const double eps = 1e-6;

const int N = 110;

int n;
double a[N][N];

int gauss() {
	//c表示枚举的列,r 表示行
	int c, r;

	for (c = 0, r = 0; c < n; c++) {

		//第一步
		int t = r;
		for (int i = r; i < n; i++) {
			if (fabs(a[i][c] > fabs(a[t][c]))) {
				t = i;
			}
		}
		//浮点数不能判断是否等于0,因为有误差,所以判断是否小于等于一个很小的数
		if (fabs(a[t][c]) < eps) {
			continue;
		}

		//第二步
		for (int i = c; i <= n; i++) {
			swap(a[t][i], a[r][i]);
		}
		//3
		for (int i = n; i >= c; i--) {
			a[r][i] /= a[r][c];
		}

		//4
		for (int i = r + 1; i < n; i++) {
			if (fabs(a[i][c]) > eps) {
				for (int j = n; j >= c; j--) {
					a[i][j] -= a[r][j] * a[i][c];
				}
			}
		}
		r++;
	}

	if (r < n) {
		for (int i = r; i < n; i++) {
			if (fabs(a[i][n]) > eps) {
				return 2; // 无解
			}
			return 1; //无穷解
		}
	}


	for (int i = n - 1; i >= 0; i--) {
		for (int j = i + 1; j < n; j++) {
			a[i][n] -= a[i][j] * a[j][n];
		}
	}
	return 0; // 唯一解

}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n + 1; j++) {
			cin >> a[i][j];
		}
	}

	int t = gauss();

	if (t == 0) {
		for (int i = 0; i < n; i++) {
			printf("%.2lf\n", a[i][n]);
			//cout << a[i][n];
		}
	}
	else if (t == 1) {
		puts("Infinite group solution");
	}
	else {
		puts("No solution");
	}
	return 0;
}
上一篇:C语言浮点数测试是否相等(取绝对值函数fabs())


下一篇:sqrt函数实现