Сначала нахожу детерминант матрицы A, потом заполняю матрицу В алгебраическими дополнениями. Сделал как у вас в примере:
| Код | #include <stdio.h> #include <stdlib.h>
#define N 3
void FindAlgDop(int A[N][N], int size, int B[N][N]) { int i, j; // находим определитель матрицы A int det = FindDeterminant(A, size); if(det > 0) // это для знака алгебраического дополнения det = -1; else det = 1;
int minor[size-1][size-1]; for(j = 0; j < size; j++) { for(i = 0;i < size; i++) { // получаем алгебраическое дополнение GetMinor(A, minor, j, i, size); if( (i+j)%2 == 0) B[j][i] = -det*FindDeterminant(minor, size-1); else B[j][i] = det*FindDeterminant(minor, size-1); } } }
int GetMinor(int A[N][N], int B[N][N], int x, int y, int size) { int xCount = 0, yCount = 0; int i, j; for(i = 0; i < size; i++ ) { if( i != x ) { yCount = 0; for(j = 0; j < size; j++) { if( j != y ) { B[xCount][yCount] = A[i][j]; yCount++; } } xCount++; } } return 0; }
int FindDeterminant(int A[N][N], int size) { // останавливаем рекурсию, если матрица // состоит из одного элемента if(size == 1) { return A[0][0]; } else { int det = 0; int i; int Minor[size-1][size-1]; for(i = 0; i < size; i++ ) { GetMinor( A, Minor, 0, i , size); // Рекурсия det += pow( -1, i ) * A[0][i] * FindDeterminant( Minor, size-1 ); } return det; } }
int main() { int i, j;
int A[N][N] = { {1, 2, 3}, {2, 1, 3}, {3, 2, 1} }; int B[N][N]; printf("matr A:\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%i ", A[i][j]); printf("\n"); } // находим определитель матрицы matr1 int determinant = FindDeterminant(A, N); printf("Determinant matr A: %i\n", determinant); // находим алгебраические дополнения // матрицы A и записываем их в B FindAlgDop(A, N, B); printf("matr B:\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%i ", B[i][j]); printf("\n"); } _getch(); return 0; }
|
|