Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.69 KB | None | 0 0
  1. // Wyznacznik wg rekurencyjnego rozwinięcia Laplace'a
  2. // Data : 8.02.2011
  3. // (C)2012 mgr Jerzy Wałaszek
  4. //----------------------------
  5.  
  6. #include <iostream>
  7. #include <iomanip>
  8.  
  9. using namespace std;
  10.  
  11. // Rekurencyjna funkcja obliczająca rozwinięcie Laplace'a
  12. //-------------------------------------------------------
  13. double det(int n, int w, int * WK, double ** A)
  14. {
  15. int i,j,k,m, * KK;
  16. double s;
  17.  
  18. if(n == 1) // sprawdzamy warunek zakończenia rekurencji
  19.  
  20. return A[w][WK[0]]; // macierz 1 x 1, wyznacznik równy elementowi
  21.  
  22. else
  23. {
  24.  
  25. KK = new int[n - 1]; // tworzymy dynamiczny wektor kolumn
  26.  
  27. s = 0; // zerujemy wartość rozwinięcia
  28. m = 1; // początkowy mnożnik
  29.  
  30. for(i = 0; i < n; i++) // pętla obliczająca rozwinięcie
  31. {
  32.  
  33. k = 0; // tworzymy wektor kolumn dla rekurencji
  34.  
  35. for(j = 0; j < n - 1; j++) // ma on o 1 kolumnę mniej niż WK
  36. {
  37. if(k == i) k++; // pomijamy bieżącą kolumnę
  38. KK[j] = WK[k++]; // pozostałe kolumny przenosimy do KK
  39. }
  40.  
  41. s += m * A[w][WK[i]] * det(n - 1,w + 1, KK, A);
  42.  
  43. m = -m; // kolejny mnożnik
  44.  
  45. }
  46.  
  47. delete [] KK; // usuwamy zbędną już tablicę dynamiczną
  48.  
  49. return s; // ustalamy wartość funkcji
  50.  
  51. }
  52. }
  53.  
  54. //*** PROGRAM GŁÓWNY ***
  55. //----------------------
  56.  
  57. int main()
  58. {
  59. int n,i,j; // stopień macierzy
  60. int * WK; // wektor kolumn
  61. double ** A; // macierz
  62.  
  63. cout << fixed << setprecision(4);
  64.  
  65. cin >> n; // odczytujemy stopień macierzy
  66.  
  67. A = new double * [n]; // tworzymy macierz wskaźników
  68.  
  69. for(i = 0; i < n; i++)
  70. {
  71.  
  72. A[i] = new double[n]; // tworzymy wiersz
  73.  
  74. for(j = 0; j < n; j++) cin >> A[i][j]; // czytamy wiersz macierzy
  75.  
  76. }
  77.  
  78. WK = new int[n]; // tworzymy wiersz kolumn
  79.  
  80. for(i = 0; i < n; i++) // wypełniamy go numerami kolumn
  81. WK[i] = i;
  82.  
  83. cout << endl;
  84.  
  85. cout << det(n, 0, WK, A) << endl; // obliczamy i wyświetlamy wyznacznik
  86.  
  87. delete [] WK; // usuwamy tablice dynamiczne
  88.  
  89. for(i = 0; i < n; i++) delete [] A[i];
  90.  
  91. delete [] A;
  92.  
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement