Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define f first
- #define s second
- #define pb push_back
- using namespace std;
- typedef pair<int,int> pii;
- typedef long long ll;
- const long long INF = 1000000000000000000ll;
- int wspolczynnik(int i, int j) {
- if((i + j) % 2 == 0) return 1;
- else return -1;
- }
- double** matrix(int n, int m) {
- double** tab = new double*[n];
- for(int i = 0; i < n; i++)
- tab[i] = new double[m];
- return tab;
- }
- double** odetnij(double** A, int n, int a, int b) {
- double** ans = matrix(n-1,n-1);
- for(int i = 0; i < a-1; i++)
- for(int j = 0; j < b-1; j++)
- ans[i][j] = A[i][j];
- for(int i = 0; i < a-1; i++)
- for(int j = b-1; j < n-1; j++)
- ans[i][j] = A[i][j+1];
- for(int i = a-1; i < n-1; i++)
- for(int j = 0; j < b-1; j++)
- ans[i][j] = A[i+1][j];
- for(int i = a-1; i < n-1; i++)
- for(int j = b-1; j < n-1; j++)
- ans[i][j] = A[i+1][j+1];
- return ans;
- }
- double** AT(double** A, int n) {
- double** ans = matrix(n,n);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < n; j++)
- ans[i][j] = A[j][i];
- return ans;
- }
- double wyznacznik(double** A, int n) {
- if(n == 1)
- return A[0][0];
- if(n == 2)
- return A[0][0] * A[1][1] - A[0][1] * A[1][0];
- if(n == 3)
- return (A[0][0] * A[1][1] * A[2][2]) +
- + (A[0][1] * A[1][2] * A[2][0])
- + (A[0][2] * A[1][0] * A[2][1])
- - (A[0][0] * A[1][2] * A[2][1])
- - (A[0][1] * A[1][0] * A[2][2])
- - (A[0][2] * A[1][1] * A[2][0]);
- double sum = 0;
- for(int i = 0, j = 0; j <= n; j++)
- sum += A[i][j] * wspolczynnik(i,j) * wyznacznik(odetnij(A,n,i+1,j+1),n-1);
- return sum;
- }
- void f1() {
- int An, Am, Bn, Bm;
- cout<<"Podaj rozmiary macierzy:\n A: ";
- cin>>An>>Am;
- cout<<" B: ";
- cin>>Bn>>Bm;
- if(An != Bn || Am != Bm) {
- cout<<"Nieprawidlowe wymiary macierzy\n";
- return;
- }
- int n = An, m = Am;
- double** A = matrix(n,m);
- double** B = matrix(n,m);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < m; j++)
- cin>>A[i][j];
- for(int i = 0; i < n; i++)
- for(int j = 0; j < m; j++)
- cin>>B[i][j];
- for(int i = 0; i < n; i++)
- for(int j = 0; j < m; j++)
- A[i][j] += B[i][j];
- cout<<"Macierz wynikowa: \n";
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < m; j++)
- cout<<A[i][j]<<" ";
- cout<<"\n";
- }
- }
- void f2() {
- int An, Am, Bn, Bm;
- cout<<"Podaj rozmiary macierzy:\n A: ";
- cin>>An>>Am;
- cout<<" B: ";
- cin>>Bn>>Bm;
- if(Am != Bn) {
- cout<<"Nieprawidlowe wymiary macierzy\n";
- return;
- }
- int n = An, m = Bm, k = Am;
- double** A = matrix(An,Am);
- double** B = matrix(Bn,Bm);
- for(int i = 0; i < An; i++)
- for(int j = 0; j < Am; j++)
- cin>>A[i][j];
- for(int i = 0; i < Bn; i++)
- for(int j = 0; j < Bm; j++)
- cin>>B[i][j];
- double** C = matrix(n,m);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < m; j++) {
- double sum = 0;
- for(int x = 0; x < k; x++)
- sum += A[i][x] * B[x][j];
- C[i][j] = sum;
- }
- cout<<"Macierz wynikowa: \n";
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < m; j++)
- cout<<C[i][j]<<" ";
- cout<<"\n";
- }
- }
- void f3() {
- int n, m;
- cout<<"Podaj rozmiary macierzy:\n A: ";
- cin>>n>>m;
- if(n != m || m < 1 || n < 1) {
- cout<<"Nieprawidlowe wymiary macierzy\n";
- return;
- }
- double** A = matrix(n,n);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < n; j++)
- cin>>A[i][j];
- double ans = wyznacznik(A,n);
- cout<<"Wyznacznik wpisanej macierzy wynosi "<<ans<<"\n";
- }
- void f4() {
- int An, Am;
- cout<<"Podaj rozmiary macierzy:\n";
- cin>>An>>Am;
- if(An != Am || Am < 1 || An < 1) {
- cout<<"Nieprawidlowe wymiary macierzy\n";
- return;
- }
- int n = An;
- double** A = matrix(n,n);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < n; j++)
- cin>>A[i][j];
- double w = wyznacznik(A,n);
- if(w == 0) {
- cout<<"Wyznacznik wpisanej macierzy wynosi 0, macierz odwrotna nie istnieje\n";
- return;
- }
- double** ans = matrix(n,n);
- for(int i = 0; i < n; i++)
- for(int j = 0; j < n; j++)
- ans[i][j] = wspolczynnik(i,j) * wyznacznik(odetnij(A,n,i+1,j+1),n-1);
- ans = AT(ans,n);
- double mnoznik = (double) 1.0 / w;
- for(int i = 0; i < n; i++)
- for(int j = 0; j < n; j++)
- ans[i][j] *= mnoznik;
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < n; j++)
- cout<<fixed<<setprecision(3)<<ans[i][j]<<" ";
- cout<<"\n";
- }
- }
- int main() {
- char s[20];
- scanf("%s",s);
- if(!strcmp(s,"dodaj"))
- f1();
- if(!strcmp(s,"pomnoz"))
- f2();
- if(!strcmp(s,"wyznacznik"))
- f3();
- if(!strcmp(s,"odwrotna"))
- f4();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement