freesky

determinant calculation

Nov 3rd, 2012
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int n;
  6. int *p;
  7. int *c;
  8. double *m;
  9. double det;
  10.  
  11. int inversions(int *p) {
  12.     extern int n;
  13.     int s = 0;
  14.  
  15.     for (int i = 0; i < n; i++)
  16.         for (int j = i + 1; j < n; j++)
  17.             s += *(p + i) > *(p + j);
  18.     return s;
  19. }
  20.  
  21. void swap(int i, int j) {
  22.     extern int *c;
  23.  
  24.     int t = *(c + i);
  25.     *(c + i) = *(c + j);
  26.     *(c + j) = t;
  27. }
  28.  
  29. void calc(int k) {
  30.     extern int n;
  31.     extern int *p;
  32.     extern int *c;
  33.     extern double *m;
  34.     extern double det;
  35.  
  36.     if (k == n) {
  37.         for (int i = 0; i < n; i++)
  38.             *(p + i) = *(c + i);
  39.  
  40.         double a = 1.0;
  41.         for (int i = 0; i < n; i++) {
  42.              a *= *(m + (*(p + i) - 1) * n + i);
  43.         }
  44.         det += pow(-1, inversions(p)) * a;
  45.     }
  46.     else {
  47.         for (int j = k; j < n; j++) {
  48.              swap(k, j);
  49.              calc(k + 1);
  50.              swap(k, j);
  51.         }
  52.     }
  53. }
  54.  
  55. int main(int argc, char *argv[]) {
  56.     extern int n; // matrix size
  57.     extern int *p; // rearrangements
  58.     extern int *c; // canonical sequence
  59.     extern double *m; // matrix
  60.     extern double det;
  61.  
  62.     printf("РАЗМЕР МАТРИЦЫ = "); scanf("%d", &n);
  63.     putchar('\n');
  64.  
  65.     p = (int *)malloc(sizeof(int) * n);
  66.     c = (int *)malloc(sizeof(int) * n);
  67.     m = (double *)malloc(sizeof(double) * n * n);
  68.     det = 0.0;
  69.  
  70.     for (int i = 0; i < n; i++)
  71.         *(c + i) = i + 1;
  72.  
  73.     for (int i = 0; i < n; i++) {
  74.         printf("---СТРОКА #%d---\n", i + 1);
  75.         for (int j = 0; j < n; j++) {
  76.             printf("столбец #%d = ", j + 1);
  77.             scanf("%lf", m + i * n + j);
  78.         }
  79.         putchar('\n');
  80.     }
  81.     putchar('\n');
  82.  
  83.     calc(0);
  84.  
  85.     for (int i = 0; i < n; i++) {
  86.         for (int j = 0; j < n; j++)
  87.             printf("%-g ", *(m + i * n + j));
  88.         putchar('\n');
  89.     }
  90.     putchar('\n');
  91.     putchar('\n');
  92.  
  93.     printf("ОПРЕДЕЛИТЕЛЬ = %g\n", det);
  94.  
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment