テンプレート-ガウスの消去法

#include<cmath>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 110;
const double eps = 1e-6;

int n;
double u[N][N];

int gauss() {
    
    
	int x, y;
	for (y = 1, x = 1; y <= n; y++) {
    
    
		int pos = x;
		for (int i = x; i <= n; i++) {
    
    
			if (fabs(u[i][y]) > fabs(u[pos][y])) {
    
    
				pos = i;
			}
		}

		if (fabs(u[pos][y]) < eps) continue;

		for (int j = y; j <= n + 1; j++) swap(u[pos][j], u[x][j]);
		for (int j = n + 1; j >= y; j--) u[x][j] /= u[x][y];
		for (int i = x + 1; i <= n; i++) {
    
    
			if (fabs(u[i][y]) > eps) {
    
    
				for (int j = n + 1; j >= y; j--) {
    
    
					u[i][j] -= u[i][y] * u[x][j];
				}
			}
		}

		x++;
	}
	if (x <= n) {
    
    
		for (int i = x; i <= n; i++) {
    
    
			if (fabs(u[i][n] > eps)) {
    
    
				return 2;
			}
		}
		return 1;
	}

	for (int i = n; i >= 1; i--) {
    
    
		for (int j = i + 1; j <= n; j++) {
    
    
			u[i][n + 1] -= u[i][j] * u[j][n + 1];
		}
	}
	return 0;
}

int main() {
    
    

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

	int jg = gauss();
	if (jg == 0) {
    
    
		for (int i = 1; i <= n; i++) printf("%.2lf\n", u[i][n + 1]);
	}
	else cout << "No Solution" << endl;
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_45739057/article/details/107486453