#include <stdio.h>
#include <stdlib.h>
void inputMatrix( int ** matrix, int m, int n) {
// Функция для ввода матрицы размером m x n
printf ( "Введите элементы матрицы %dx%d:\n " , m
, n
) ; for ( int i = 0 ; i < m; i++ ) {
for ( int j = 0 ; j < n; j++ ) {
printf ( "Элемент [%d][%d]: " , i
, j
) ; scanf ( "%d" , & matrix
[ i
] [ j
] ) ; // Считываем элемент матрицы }
}
}
void freeMatrix( int ** matrix, int m) {
// Функция для освобождения памяти, выделенной под матрицу
for ( int i = 0 ; i < m; i++ ) {
}
}
double determinant( int ** matrix, int n) {
// Функция для вычисления определителя матрицы
if ( n <= 0 ) {
// Если размер матрицы неверный, выводим сообщение и возвращаем 0
printf ( "Невозможно вычислить определитель для матрицы размером %dx%d\n " , n
, n
) ; return 0 ;
}
if ( n == 1 ) {
return matrix[ 0 ] [ 0 ] ; // Определитель 1x1
}
if ( n == 2 ) {
// Определитель 2x2
return matrix[ 0 ] [ 0 ] * matrix[ 1 ] [ 1 ] - matrix[ 0 ] [ 1 ] * matrix[ 1 ] [ 0 ] ;
}
double det = 0 ; // Переменная для хранения определителя
for ( int p = 0 ; p < n; p++ ) {
// Создаем подматрицу
int ** subMatrix
= ( int ** ) malloc ( ( n
- 1 ) * sizeof ( int * ) ) ; for ( int i = 0 ; i < n - 1 ; i++ ) {
subMatrix
[ i
] = ( int * ) malloc ( ( n
- 1 ) * sizeof ( int ) ) ; }
for ( int i = 1 ; i < n; i++ ) {
int colIndex = 0 ;
for ( int j = 0 ; j < n; j++ ) {
if ( j == p) continue ; // Пропускаем текущий столбец
subMatrix[ i - 1 ] [ colIndex] = matrix[ i] [ j] ;
colIndex++;
}
}
// Рекурсивно вычисляем детерминант подматрицы
det += ( p % 2 == 0 ? 1 : - 1 ) * matrix[ 0 ] [ p] * determinant( subMatrix, n - 1 ) ;
freeMatrix( subMatrix, n - 1 ) ; // Освобождаем память под подматрицу
}
return det;
}
int main( ) {
int m, n;
// Считываем размеры матрицы
printf ( "Введите количество строк (M): " ) ; printf ( "Введите количество столбцов (N): " ) ;
// Проверка на возможность вычисления определителя
if ( m != n) {
printf ( "Определитель может быть вычислен только для квадратной матрицы. Введите квадратную матрицу!\n " ) ; return 0 ;
}
// Выделяем память под матрицу
int ** matrix
= ( int ** ) malloc ( m
* sizeof ( int * ) ) ; for ( int i = 0 ; i < m; i++ ) {
matrix
[ i
] = ( int * ) malloc ( n
* sizeof ( int ) ) ; }
// Вводим матрицу
inputMatrix( matrix, m, n) ;
// Вычисляем определитель
double det = determinant( matrix, n) ;
if ( det != 0 ) {
printf ( "Определитель матрицы: %.2f\n " , det
) ; }
// Освобождаем память
freeMatrix( matrix, m) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnZvaWQgaW5wdXRNYXRyaXgoaW50ICoqbWF0cml4LCBpbnQgbSwgaW50IG4pIHsKICAgIC8vINCk0YPQvdC60YbQuNGPINC00LvRjyDQstCy0L7QtNCwINC80LDRgtGA0LjRhtGLINGA0LDQt9C80LXRgNC+0LwgbSB4IG4KICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0Y3Qu9C10LzQtdC90YLRiyDQvNCw0YLRgNC40YbRiyAlZHglZDpcbiIsIG0sIG4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBwcmludGYoItCt0LvQtdC80LXQvdGCIFslZF1bJWRdOiAiLCBpLCBqKTsKICAgICAgICAgICAgc2NhbmYoIiVkIiwgJm1hdHJpeFtpXVtqXSk7IC8vINCh0YfQuNGC0YvQstCw0LXQvCDRjdC70LXQvNC10L3RgiDQvNCw0YLRgNC40YbRiwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBmcmVlTWF0cml4KGludCAqKm1hdHJpeCwgaW50IG0pIHsKICAgIC8vINCk0YPQvdC60YbQuNGPINC00LvRjyDQvtGB0LLQvtCx0L7QttC00LXQvdC40Y8g0L/QsNC80Y/RgtC4LCDQstGL0LTQtdC70LXQvdC90L7QuSDQv9C+0LQg0LzQsNGC0YDQuNGG0YMKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgZnJlZShtYXRyaXhbaV0pOwogICAgfQogICAgZnJlZShtYXRyaXgpOwp9Cgpkb3VibGUgZGV0ZXJtaW5hbnQoaW50ICoqbWF0cml4LCBpbnQgbikgewogICAgLy8g0KTRg9C90LrRhtC40Y8g0LTQu9GPINCy0YvRh9C40YHQu9C10L3QuNGPINC+0L/RgNC10LTQtdC70LjRgtC10LvRjyDQvNCw0YLRgNC40YbRiwogICAgaWYgKG4gPD0gMCkgewogICAgICAgIC8vINCV0YHQu9C4INGA0LDQt9C80LXRgCDQvNCw0YLRgNC40YbRiyDQvdC10LLQtdGA0L3Ri9C5LCDQstGL0LLQvtC00LjQvCDRgdC+0L7QsdGJ0LXQvdC40LUg0Lgg0LLQvtC30LLRgNCw0YnQsNC10LwgMAogICAgICAgIHByaW50Zigi0J3QtdCy0L7Qt9C80L7QttC90L4g0LLRi9GH0LjRgdC70LjRgtGMINC+0L/RgNC10LTQtdC70LjRgtC10LvRjCDQtNC70Y8g0LzQsNGC0YDQuNGG0Ysg0YDQsNC30LzQtdGA0L7QvCAlZHglZFxuIiwgbiwgbik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAobiA9PSAxKSB7CiAgICAgICAgcmV0dXJuIG1hdHJpeFswXVswXTsgLy8g0J7Qv9GA0LXQtNC10LvQuNGC0LXQu9GMIDF4MQogICAgfQogICAgaWYgKG4gPT0gMikgewogICAgICAgIC8vINCe0L/RgNC10LTQtdC70LjRgtC10LvRjCAyeDIKICAgICAgICByZXR1cm4gbWF0cml4WzBdWzBdICogbWF0cml4WzFdWzFdIC0gbWF0cml4WzBdWzFdICogbWF0cml4WzFdWzBdOwogICAgfQogICAgCiAgICBkb3VibGUgZGV0ID0gMDsgLy8g0J/QtdGA0LXQvNC10L3QvdCw0Y8g0LTQu9GPINGF0YDQsNC90LXQvdC40Y8g0L7Qv9GA0LXQtNC10LvQuNGC0LXQu9GPCiAgICBmb3IgKGludCBwID0gMDsgcCA8IG47IHArKykgewogICAgICAgIC8vINCh0L7Qt9C00LDQtdC8INC/0L7QtNC80LDRgtGA0LjRhtGDCiAgICAgICAgaW50ICoqc3ViTWF0cml4ID0gKGludCAqKiltYWxsb2MoKG4gLSAxKSAqIHNpemVvZihpbnQgKikpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgewogICAgICAgICAgICBzdWJNYXRyaXhbaV0gPSAoaW50ICopbWFsbG9jKChuIC0gMSkgKiBzaXplb2YoaW50KSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGludCBjb2xJbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAoaiA9PSBwKSBjb250aW51ZTsgLy8g0J/RgNC+0L/Rg9GB0LrQsNC10Lwg0YLQtdC60YPRidC40Lkg0YHRgtC+0LvQsdC10YYKICAgICAgICAgICAgICAgIHN1Yk1hdHJpeFtpIC0gMV1bY29sSW5kZXhdID0gbWF0cml4W2ldW2pdOwogICAgICAgICAgICAgICAgY29sSW5kZXgrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g0KDQtdC60YPRgNGB0LjQstC90L4g0LLRi9GH0LjRgdC70Y/QtdC8INC00LXRgtC10YDQvNC40L3QsNC90YIg0L/QvtC00LzQsNGC0YDQuNGG0YsKICAgICAgICBkZXQgKz0gKHAgJSAyID09IDAgPyAxIDogLTEpICogbWF0cml4WzBdW3BdICogZGV0ZXJtaW5hbnQoc3ViTWF0cml4LCBuIC0gMSk7CiAgICAgICAgCiAgICAgICAgZnJlZU1hdHJpeChzdWJNYXRyaXgsIG4gLSAxKTsgLy8g0J7RgdCy0L7QsdC+0LbQtNCw0LXQvCDQv9Cw0LzRj9GC0Ywg0L/QvtC0INC/0L7QtNC80LDRgtGA0LjRhtGDCiAgICB9CiAgICByZXR1cm4gZGV0Owp9CgppbnQgbWFpbigpIHsKICAgIGludCBtLCBuOwoKICAgIC8vINCh0YfQuNGC0YvQstCw0LXQvCDRgNCw0LfQvNC10YDRiyDQvNCw0YLRgNC40YbRiwogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQvtC6IChNKTogIik7CiAgICBzY2FuZigiJWQiLCAmbSk7CiAgICBwcmludGYoItCS0LLQtdC00LjRgtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGB0YLQvtC70LHRhtC+0LIgKE4pOiAiKTsKICAgIHNjYW5mKCIlZCIsICZuKTsKCiAgICAvLyDQn9GA0L7QstC10YDQutCwINC90LAg0LLQvtC30LzQvtC20L3QvtGB0YLRjCDQstGL0YfQuNGB0LvQtdC90LjRjyDQvtC/0YDQtdC00LXQu9C40YLQtdC70Y8KICAgIGlmIChtICE9IG4pIHsKICAgICAgICBwcmludGYoItCe0L/RgNC10LTQtdC70LjRgtC10LvRjCDQvNC+0LbQtdGCINCx0YvRgtGMINCy0YvRh9C40YHQu9C10L0g0YLQvtC70YzQutC+INC00LvRjyDQutCy0LDQtNGA0LDRgtC90L7QuSDQvNCw0YLRgNC40YbRiy4g0JLQstC10LTQuNGC0LUg0LrQstCw0LTRgNCw0YLQvdGD0Y4g0LzQsNGC0YDQuNGG0YMhXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyDQktGL0LTQtdC70Y/QtdC8INC/0LDQvNGP0YLRjCDQv9C+0LQg0LzQsNGC0YDQuNGG0YMKICAgIGludCAqKm1hdHJpeCA9IChpbnQgKiopbWFsbG9jKG0gKiBzaXplb2YoaW50ICopKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgbWF0cml4W2ldID0gKGludCAqKW1hbGxvYyhuICogc2l6ZW9mKGludCkpOwogICAgfQoKICAgIC8vINCS0LLQvtC00LjQvCDQvNCw0YLRgNC40YbRgwogICAgaW5wdXRNYXRyaXgobWF0cml4LCBtLCBuKTsKCiAgICAvLyDQktGL0YfQuNGB0LvRj9C10Lwg0L7Qv9GA0LXQtNC10LvQuNGC0LXQu9GMCiAgICBkb3VibGUgZGV0ID0gZGV0ZXJtaW5hbnQobWF0cml4LCBuKTsKICAgIGlmIChkZXQgIT0gMCkgewogICAgICAgIHByaW50Zigi0J7Qv9GA0LXQtNC10LvQuNGC0LXQu9GMINC80LDRgtGA0LjRhtGLOiAlLjJmXG4iLCBkZXQpOwogICAgfQoKICAgIC8vINCe0YHQstC+0LHQvtC20LTQsNC10Lwg0L/QsNC80Y/RgtGMCiAgICBmcmVlTWF0cml4KG1hdHJpeCwgbSk7CiAgICByZXR1cm4gMDsKfQ==