#include <iostream>
using namespace std;
const double eps = 0.000001;
int Rev(int* n, double*** A, double*** D)
{
int r, i, j, k, v;
double c, z, aii;
for (i = 0; i < *n; i++)
{
for (j = 0; j < *n; j++)
{
if (i == j)
(*D)[i][j] = 1;
else
(*D)[i][j] = 0;
}
}
i = 0; r = *n;
while (i < r)
{
v = i; /*выбор ведущего элемента:*/
for (j = i + 1; j < *n; j++)
if (abs((*A)[j][i]) > abs((*A)[v][i])) v = j;
if (abs((*A)[v][i]) < eps)
r = i;
else
{
if (v != i)
{
for (j = i; j < *n; j++)
{
z = (*A)[i][j];
(*A)[i][j] = (*A)[v][j];
(*A)[v][j] = z;
}
for (j = 0; j < *n; j++)
{
z = (*D)[i][j];
(*D)[i][j] = (*D)[v][j];
(*D)[v][j] = z;
}
}
aii = (*A)[i][i];
for (j = i; j < *n; j++) (*A)[i][j] /= aii;
for (j = 0; j < *n; j++) (*D)[i][j] /= aii;
for (k = 0; k < *n; k++)
if (k != i)
{
c = (*A)[k][i];
for (j = i; j < *n; j++) (*A)[k][j] -= c * (*A)[i][j];
for (j = 0; j < *n; j++) (*D)[k][j] -= c * (*D)[i][j];
}
i++;
}
}
if (r < *n)
return 0;
else
return 1;
}
void Mult(int* n, double*** A, double** B, double** X)
{
int i, j;
double d;
for (i = 0; i < *n; i++)
{
d = 0.0;
for (j = 0; j < *n; j++)
d += (((*A)[i][j]) * ((*B)[j]));
(*X)[i] = d;
}
}
int main()
{
setlocale(LC_ALL, "");
int n, i, j;
double** A, **D, * B1, * B2, *X1, *X2;
cout << "Введите, пожалуйста, n: ";
cin >> n;
A = new double* [n];
D = new double* [n];
B1 = new double[n];
B2 = new double[n];
X1 = new double[n];
X2 = new double[n];
cout << "Введите, пожалуйста, значения матрицы A:" << endl;
for (i = 0; i < n; i++)
{
A[i] = new double[n];
D[i] = new double[n];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cin >> A[i][j];
}
}
if (Rev(&n, &A, &D))
{
cout << "Введите, пожалуйста, значения вектора B1:" << endl;
for (i = 0; i < n; i++)
{
cin >> B1[i];
}
cout << "Введите, пожалуйста, значения вектора B2:" << endl;
for (i = 0; i < n; i++)
{
cin >> B2[i];
}
Mult(&n, &D, &B1, &X1);
Mult(&n, &D, &B2, &X2);
cout << "X1: ";
for (i = 0; i < n; i++)
{
cout << X1[i] << " ";
}
cout << endl;
cout << "X2: ";
for (i = 0; i < n; i++)
{
cout << X2[i] << " ";
}
cout << endl;
}
else
{
cout << "Матрицва A вырожденная!" << endl;
}
for (i = 0; i < n; i++)
{
delete[](A[i]);
delete[](D[i]);
}
delete[] A;
delete[] D;
delete[] B1;
delete[] B2;
delete[] X1;
delete[] X2;
system("pause");
return 0;
}