Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.42 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define pb push_back
  5. using namespace std;
  6. typedef pair<int,int> pii;
  7. typedef long long ll;
  8. const long long INF = 1000000000000000000ll;
  9.  
  10.  
  11.  
  12.  
  13. int wspolczynnik(int i, int j) {
  14. if((i + j) % 2 == 0) return 1;
  15. else return -1;
  16. }
  17.  
  18. double** matrix(int n, int m) {
  19. double** tab = new double*[n];
  20. for(int i = 0; i < n; i++)
  21. tab[i] = new double[m];
  22. return tab;
  23. }
  24.  
  25. double** odetnij(double** A, int n, int a, int b) {
  26. double** ans = matrix(n-1,n-1);
  27. for(int i = 0; i < a-1; i++)
  28. for(int j = 0; j < b-1; j++)
  29. ans[i][j] = A[i][j];
  30. for(int i = 0; i < a-1; i++)
  31. for(int j = b-1; j < n-1; j++)
  32. ans[i][j] = A[i][j+1];
  33. for(int i = a-1; i < n-1; i++)
  34. for(int j = 0; j < b-1; j++)
  35. ans[i][j] = A[i+1][j];
  36. for(int i = a-1; i < n-1; i++)
  37. for(int j = b-1; j < n-1; j++)
  38. ans[i][j] = A[i+1][j+1];
  39. return ans;
  40. }
  41.  
  42. double** AT(double** A, int n) {
  43. double** ans = matrix(n,n);
  44. for(int i = 0; i < n; i++)
  45. for(int j = 0; j < n; j++)
  46. ans[i][j] = A[j][i];
  47. return ans;
  48. }
  49.  
  50. double wyznacznik(double** A, int n) {
  51. if(n == 1)
  52. return A[0][0];
  53. if(n == 2)
  54. return A[0][0] * A[1][1] - A[0][1] * A[1][0];
  55. if(n == 3)
  56. return (A[0][0] * A[1][1] * A[2][2]) +
  57. + (A[0][1] * A[1][2] * A[2][0])
  58. + (A[0][2] * A[1][0] * A[2][1])
  59. - (A[0][0] * A[1][2] * A[2][1])
  60. - (A[0][1] * A[1][0] * A[2][2])
  61. - (A[0][2] * A[1][1] * A[2][0]);
  62. double sum = 0;
  63. for(int i = 0, j = 0; j <= n; j++)
  64. sum += A[i][j] * wspolczynnik(i,j) * wyznacznik(odetnij(A,n,i+1,j+1),n-1);
  65. return sum;
  66. }
  67.  
  68. void f1() {
  69. int An, Am, Bn, Bm;
  70. cout<<"Podaj rozmiary macierzy:\n A: ";
  71. cin>>An>>Am;
  72. cout<<" B: ";
  73. cin>>Bn>>Bm;
  74. if(An != Bn || Am != Bm) {
  75. cout<<"Nieprawidlowe wymiary macierzy\n";
  76. return;
  77. }
  78. int n = An, m = Am;
  79. double** A = matrix(n,m);
  80. double** B = matrix(n,m);
  81. for(int i = 0; i < n; i++)
  82. for(int j = 0; j < m; j++)
  83. cin>>A[i][j];
  84. for(int i = 0; i < n; i++)
  85. for(int j = 0; j < m; j++)
  86. cin>>B[i][j];
  87. for(int i = 0; i < n; i++)
  88. for(int j = 0; j < m; j++)
  89. A[i][j] += B[i][j];
  90. cout<<"Macierz wynikowa: \n";
  91. for(int i = 0; i < n; i++) {
  92. for(int j = 0; j < m; j++)
  93. cout<<A[i][j]<<" ";
  94. cout<<"\n";
  95. }
  96. }
  97.  
  98. void f2() {
  99. int An, Am, Bn, Bm;
  100. cout<<"Podaj rozmiary macierzy:\n A: ";
  101. cin>>An>>Am;
  102. cout<<" B: ";
  103. cin>>Bn>>Bm;
  104. if(Am != Bn) {
  105. cout<<"Nieprawidlowe wymiary macierzy\n";
  106. return;
  107. }
  108. int n = An, m = Bm, k = Am;
  109. double** A = matrix(An,Am);
  110. double** B = matrix(Bn,Bm);
  111. for(int i = 0; i < An; i++)
  112. for(int j = 0; j < Am; j++)
  113. cin>>A[i][j];
  114. for(int i = 0; i < Bn; i++)
  115. for(int j = 0; j < Bm; j++)
  116. cin>>B[i][j];
  117.  
  118. double** C = matrix(n,m);
  119. for(int i = 0; i < n; i++)
  120. for(int j = 0; j < m; j++) {
  121. double sum = 0;
  122. for(int x = 0; x < k; x++)
  123. sum += A[i][x] * B[x][j];
  124. C[i][j] = sum;
  125. }
  126. cout<<"Macierz wynikowa: \n";
  127. for(int i = 0; i < n; i++) {
  128. for(int j = 0; j < m; j++)
  129. cout<<C[i][j]<<" ";
  130. cout<<"\n";
  131. }
  132. }
  133.  
  134. void f3() {
  135. int n, m;
  136. cout<<"Podaj rozmiary macierzy:\n A: ";
  137. cin>>n>>m;
  138. if(n != m || m < 1 || n < 1) {
  139. cout<<"Nieprawidlowe wymiary macierzy\n";
  140. return;
  141. }
  142. double** A = matrix(n,n);
  143. for(int i = 0; i < n; i++)
  144. for(int j = 0; j < n; j++)
  145. cin>>A[i][j];
  146. double ans = wyznacznik(A,n);
  147. cout<<"Wyznacznik wpisanej macierzy wynosi "<<ans<<"\n";
  148. }
  149.  
  150. void f4() {
  151. int An, Am;
  152. cout<<"Podaj rozmiary macierzy:\n";
  153. cin>>An>>Am;
  154. if(An != Am || Am < 1 || An < 1) {
  155. cout<<"Nieprawidlowe wymiary macierzy\n";
  156. return;
  157. }
  158. int n = An;
  159. double** A = matrix(n,n);
  160. for(int i = 0; i < n; i++)
  161. for(int j = 0; j < n; j++)
  162. cin>>A[i][j];
  163. double w = wyznacznik(A,n);
  164. if(w == 0) {
  165. cout<<"Wyznacznik wpisanej macierzy wynosi 0, macierz odwrotna nie istnieje\n";
  166. return;
  167. }
  168. double** ans = matrix(n,n);
  169. for(int i = 0; i < n; i++)
  170. for(int j = 0; j < n; j++)
  171. ans[i][j] = wspolczynnik(i,j) * wyznacznik(odetnij(A,n,i+1,j+1),n-1);
  172. ans = AT(ans,n);
  173. double mnoznik = (double) 1.0 / w;
  174. for(int i = 0; i < n; i++)
  175. for(int j = 0; j < n; j++)
  176. ans[i][j] *= mnoznik;
  177. for(int i = 0; i < n; i++) {
  178. for(int j = 0; j < n; j++)
  179. cout<<fixed<<setprecision(3)<<ans[i][j]<<" ";
  180. cout<<"\n";
  181. }
  182. }
  183.  
  184. int main() {
  185. char s[20];
  186. scanf("%s",s);
  187. if(!strcmp(s,"dodaj"))
  188. f1();
  189. if(!strcmp(s,"pomnoz"))
  190. f2();
  191. if(!strcmp(s,"wyznacznik"))
  192. f3();
  193. if(!strcmp(s,"odwrotna"))
  194. f4();
  195.  
  196. return 0;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement