fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void inputMatrix(int **matrix, int m, int n) {
  5. // Функция для ввода матрицы размером m x n
  6. printf("Введите элементы матрицы %dx%d:\n", m, n);
  7. for (int i = 0; i < m; i++) {
  8. for (int j = 0; j < n; j++) {
  9. printf("Элемент [%d][%d]: ", i, j);
  10. scanf("%d", &matrix[i][j]); // Считываем элемент матрицы
  11. }
  12. }
  13. }
  14.  
  15. void freeMatrix(int **matrix, int m) {
  16. // Функция для освобождения памяти, выделенной под матрицу
  17. for (int i = 0; i < m; i++) {
  18. free(matrix[i]);
  19. }
  20. free(matrix);
  21. }
  22.  
  23. double determinant(int **matrix, int n) {
  24. // Функция для вычисления определителя матрицы
  25. if (n <= 0) {
  26. // Если размер матрицы неверный, выводим сообщение и возвращаем 0
  27. printf("Невозможно вычислить определитель для матрицы размером %dx%d\n", n, n);
  28. return 0;
  29. }
  30. if (n == 1) {
  31. return matrix[0][0]; // Определитель 1x1
  32. }
  33. if (n == 2) {
  34. // Определитель 2x2
  35. return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
  36. }
  37.  
  38. double det = 0; // Переменная для хранения определителя
  39. for (int p = 0; p < n; p++) {
  40. // Создаем подматрицу
  41. int **subMatrix = (int **)malloc((n - 1) * sizeof(int *));
  42. for (int i = 0; i < n - 1; i++) {
  43. subMatrix[i] = (int *)malloc((n - 1) * sizeof(int));
  44. }
  45.  
  46. for (int i = 1; i < n; i++) {
  47. int colIndex = 0;
  48. for (int j = 0; j < n; j++) {
  49. if (j == p) continue; // Пропускаем текущий столбец
  50. subMatrix[i - 1][colIndex] = matrix[i][j];
  51. colIndex++;
  52. }
  53. }
  54.  
  55. // Рекурсивно вычисляем детерминант подматрицы
  56. det += (p % 2 == 0 ? 1 : -1) * matrix[0][p] * determinant(subMatrix, n - 1);
  57.  
  58. freeMatrix(subMatrix, n - 1); // Освобождаем память под подматрицу
  59. }
  60. return det;
  61. }
  62.  
  63. int main() {
  64. int m, n;
  65.  
  66. // Считываем размеры матрицы
  67. printf("Введите количество строк (M): ");
  68. scanf("%d", &m);
  69. printf("Введите количество столбцов (N): ");
  70. scanf("%d", &n);
  71.  
  72. // Проверка на возможность вычисления определителя
  73. if (m != n) {
  74. printf("Определитель может быть вычислен только для квадратной матрицы. Введите квадратную матрицу!\n");
  75. return 0;
  76. }
  77.  
  78. // Выделяем память под матрицу
  79. int **matrix = (int **)malloc(m * sizeof(int *));
  80. for (int i = 0; i < m; i++) {
  81. matrix[i] = (int *)malloc(n * sizeof(int));
  82. }
  83.  
  84. // Вводим матрицу
  85. inputMatrix(matrix, m, n);
  86.  
  87. // Вычисляем определитель
  88. double det = determinant(matrix, n);
  89. if (det != 0) {
  90. printf("Определитель матрицы: %.2f\n", det);
  91. }
  92.  
  93. // Освобождаем память
  94. freeMatrix(matrix, m);
  95. return 0;
  96. }
Success #stdin #stdout 0s 5288KB
stdin
3 
3
1 
2
3
4
5
6
7
8
9
stdout
Введите количество строк (M): Введите количество столбцов (N): Введите элементы матрицы 3x3:
Элемент [0][0]: Элемент [0][1]: Элемент [0][2]: Элемент [1][0]: Элемент [1][1]: Элемент [1][2]: Элемент [2][0]: Элемент [2][1]: Элемент [2][2]: