#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
int create(int n, double *&a, double *&b) {
a = new double[n * n];
b = new double[n];
if (!a || !b) {
cerr << "Ошибка выделения памяти" << endl;
return -1;
}
cout << "Введите элементы матрицы коэффициентов (" << n << "x" << n << "):" << endl;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> a[i * n + j];
}
}
cout << "Введите вектор свободных членов (" << n << " элементов):" << endl;
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
return 0;
}
double gauss(int n, double **a, double *b, double *x) {
double det = 1.0;
int *pivot = new int[n];
for (int i = 0; i < n; ++i) {
pivot[i] = i;
}
for (int k = 0; k < n - 1; ++k) {
int max_row = k;
for (int i = k; i < n; ++i) {
if (fabs(a[pivot[i]][k]) > fabs(a[pivot[max_row]][k])) {
max_row = i;
}
}
if (max_row != k) {
swap(pivot[k], pivot[max_row]);
det *= -1;
}
double pivot_val = a[pivot[k]][k];
if (fabs(pivot_val) < 1e-10) {
cerr << "Матрица вырожденная, определитель равен 0!" << endl;
delete[] pivot;
return 0.0;
}
for (int i = k + 1; i < n; ++i) {
double factor = a[pivot[i]][k] / pivot_val;
for (int j = k; j < n; ++j) {
a[pivot[i]][j] -= factor * a[pivot[k]][j];
}
b[pivot[i]] -= factor * b[pivot[k]];
}
det *= pivot_val;
}
det *= a[pivot[n-1]][n-1];
if (fabs(a[pivot[n-1]][n-1]) < 1e-10) {
cerr << "Матрица вырожденная, определитель равен 0!" << endl;
delete[] pivot;
return 0.0;
}
for (int i = n - 1; i >= 0; --i) {
double sum = 0.0;
for (int j = i + 1; j < n; ++j) {
sum += a[pivot[i]][j] * x[j];
}
x[i] = (b[pivot[i]] - sum) / a[pivot[i]][i];
}
delete[] pivot;
return det;
}
double** convertTo2D(double *a1D, int n) {
double **a2D = new double*[n];
for (int i = 0; i < n; ++i) {
a2D[i] = &a1D[i * n];
}
return a2D;
}
void free2D(double **a, int n) {
delete[] a;
}
int main() {
int n;
cout << "Введите порядок системы линейных уравнений n: ";
cin >> n;
if (n <= 0) {
cerr << "Некорректный порядок матрицы!" << endl;
return 1;
}
double *a1D = nullptr;
double *b = nullptr;
if (create(n, a1D, b) != 0) {
return 1;
}
double **a2D = convertTo2D(a1D, n);
double *x = new double[n]();
double determinant = gauss(n, a2D, b, x);
cout << "\nРешение системы линейных уравнений:" << endl;
for (int i = 0; i < n; ++i) {
cout << "x[" << i + 1 << "] = " << fixed << setprecision(4) << x[i] << endl;
}
cout << "Определитель матрицы коэффициентов: " << fixed << setprecision(4) << determinant << endl;
return 0;
}