Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- double det(double **matrix, int n);
- void input(double ***matrix, int *n, int *m);
- void output(double det);
- int main() {
- int n, m;
- double **matrix = NULL;
- input(&matrix, &n, &m);
- if (n != m) {
- printf("n/a\n");
- } else {
- double determinant = det(matrix, n);
- output(determinant);
- }
- // Освобождаем память
- for (int i = 0; i < n; i++) {
- free(matrix[i]);
- }
- free(matrix);
- return 0;
- }
- // Рекурсивная функция для вычисления определителя
- double det(double **matrix, int n) {
- double determinant = 0;
- if (n == 1) {
- return matrix[0][0];
- }
- double **temp = (double **)malloc((n-1) * sizeof(double *));
- for (int i = 0; i < n-1; i++) {
- temp[i] = (double *)malloc((n-1) * sizeof(double));
- }
- int sign = 1;
- for (int k = 0; k < n; k++) {
- int i_sub = 0, j_sub = 0;
- for (int i = 1; i < n; i++) {
- j_sub = 0;
- for (int j = 0; j < n; j++) {
- if (j == k) continue;
- temp[i_sub][j_sub] = matrix[i][j];
- j_sub++;
- }
- i_sub++;
- }
- determinant += sign * matrix[0][k] * det(temp, n-1);
- sign = -sign;
- }
- for (int i = 0; i < n-1; i++) {
- free(temp[i]);
- }
- free(temp);
- return determinant;
- }
- void input(double ***matrix, int *n, int *m) {
- scanf("%d %d", n, m);
- *matrix = (double **)malloc(*n * sizeof(double *));
- for (int i = 0; i < *n; i++) {
- (*matrix)[i] = (double *)malloc(*m * sizeof(double));
- for (int j = 0; j < *m; j++) {
- scanf("%lf", &(*matrix)[i][j]);
- }
- }
- }
- void output(double det) {
- printf("%.6lf\n", det);
- }
- .........................................................................................................................
- Код для вычисления определителя без использования рекурсии. Один из распространённых методов — это метод Гаусса с приведением матрицы к верхнетреугольному виду, после чего определитель вычисляется как произведение элементов на главной диагонали.
- Код без рекурсии (метод Гаусса):
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- double det(double **matrix, int n);
- void input(double ***matrix, int *n, int *m);
- void output(double det);
- int main() {
- int n, m;
- double **matrix = NULL;
- input(&matrix, &n, &m);
- if (n != m) {
- printf("n/a\n");
- } else {
- double determinant = det(matrix, n);
- output(determinant);
- }
- // Освобождаем память
- for (int i = 0; i < n; i++) {
- free(matrix[i]);
- }
- free(matrix);
- return 0;
- }
- // Функция для вычисления определителя методом Гаусса (без рекурсии)
- double det(double **matrix, int n) {
- double det = 1.0;
- for (int i = 0; i < n; i++) {
- // Поиск ведущего элемента (максимального в столбце)
- int max_row = i;
- for (int k = i + 1; k < n; k++) {
- if (fabs(matrix[k][i]) > fabs(matrix[max_row][i])) {
- max_row = k;
- }
- }
- // Если ведущий элемент равен нулю, определитель = 0
- if (matrix[max_row][i] == 0.0) {
- return 0.0;
- }
- // Меняем строки местами, если нужно
- if (max_row != i) {
- double *temp = matrix[i];
- matrix[i] = matrix[max_row];
- matrix[max_row] = temp;
- det *= -1; // Меняем знак определителя при перестановке строк
- }
- // Приводим матрицу к верхнетреугольному виду
- for (int k = i + 1; k < n; k++) {
- double factor = matrix[k][i] / matrix[i][i];
- for (int j = i; j < n; j++) {
- matrix[k][j] -= factor * matrix[i][j];
- }
- }
- }
- // Вычисляем определитель как произведение диагональных элементов
- for (int i = 0; i < n; i++) {
- det *= matrix[i][i];
- }
- return det;
- }
- void input(double ***matrix, int *n, int *m) {
- scanf("%d %d", n, m);
- *matrix = (double **)malloc(*n * sizeof(double *));
- for (int i = 0; i < *n; i++) {
- (*matrix)[i] = (double *)malloc(*m * sizeof(double));
- for (int j = 0; j < *m; j++) {
- scanf("%lf", &(*matrix)[i][j]);
- }
- }
- }
- void output(double det) {
- printf("%.6lf\n", det);
- }
- ....................................
- Входные данные
- 3 3
- 1 2 3
- 4 5 6
- 7 8 9
- Выходные данные
- 0.000000
- ....................................
Advertisement
Add Comment
Please, Sign In to add comment