Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <locale.h>
- #include <conio.h>
- #include <stdlib.h>
- #define N 100
- int t,m, n, n1, p, i, j, k, r, um = 0,sum = 0, A[N][N], B[N][N], C[N][N],max, umsh = 0,sumsh = 0;
- void umshtr(int A[N][N], int B[N][N],int C[N][N], int max)
- {
- for (i = 0; i < max; i++)
- {
- for (j = 0; j < max; j++)
- {
- C[i][j] = 0;
- for (r = 0; r < max; r++)
- {
- C[i][j] += A[i][r] * B[r][j];
- umsh++;
- sumsh++;
- }
- sumsh--;
- }
- }
- }
- void sumshtr(int A[N][N], int B[N][N], int C[N][N],int max)
- {
- for (i = 0; i < max; i++)
- {
- for (j = 0; j < max; j++)
- {
- C[i][j] = A[i][j] + B[i][j];
- sumsh++;
- }
- }
- }
- void raznshtr(int A[N][N], int B[N][N], int C[N][N], int max)
- {
- for (i = 0; i < max; i++)
- {
- for (j = 0; j < max; j++)
- {
- C[i][j] = A[i][j] - B[i][j];
- sumsh++;
- }
- }
- }
- int shtrassen(int A[N][N],int B[N][N], int C[N][N],int max)
- {
- int A11[N][N], A12[N][N], A21[N][N], A22[N][N];
- int B11[N][N], B12[N][N], B21[N][N], B22[N][N];
- int C11[N][N], C12[N][N], C21[N][N], C22[N][N];
- int R1[N][N], R2[N][N], P1[N][N], P2[N][N], P3[N][N], P4[N][N], P5[N][N], P6[N][N], P7[N][N];
- if (max % 2 == 1)
- {
- max++;
- for (i = 0; i < max; i++)
- {
- A[i][max] = 0;
- B[i][max] = 0;
- }
- for (j = 0; j < max; j++)
- {
- A[max][j] = 0;
- B[max][j] = 0;
- }
- }
- if (max > k)
- {
- for (i = 0; i < max/2; i++)
- {
- for (j = 0; j < max/2; j++)
- {
- A11[i][j] = A[i][j];
- B11[i][j] = B[i][j];
- }
- }
- for (i = 0; i < max/2; i++)
- {
- for (j = max/2; j < max; j++)
- {
- A12[i][j-max/2] = A[i][j];
- B12[i][j-max/2] = B[i][j];
- }
- }
- for (i = max/2; i < max; i++)
- {
- for (j = 0; j < max/2; j++)
- {
- A21[i- max / 2][j] = A[i][j];
- B21[i- max / 2][j] = B[i][j];
- }
- }
- for (i = max/2; i < max; i++)
- {
- for (j = max/2; j < max; j++)
- {
- A22[i-max / 2][j - max / 2] = A[i][j];
- B22[i - max / 2][j - max / 2] = B[i][j];
- }
- }
- sumshtr(A11,A22,R1, max);
- sumshtr(B11, B22,R2, max);
- shtrassen(R1, R2, P1, max/2);
- sumshtr(A21, A22, R1, max);
- shtrassen(R1, B11, P2, max/2);
- raznshtr(B12, B22, R1, max);
- shtrassen(A22, R1, P3, max/2);
- raznshtr(B21, B11, R1, max);
- shtrassen(A22, R1, P4, max/2);
- sumshtr(A11, A12, R1, max);
- shtrassen(R1, B22, P5, max/2);
- raznshtr(A21, A11, R1, max);
- sumshtr(B11, B12, R2, max);
- shtrassen(R1, R2, P6, max/2);
- raznshtr(A12, A22, R1, max);
- sumshtr(B21, B22, R2, max);
- shtrassen(R1, R2, P7, max/2);
- sumshtr(P1, P4, R1, max);
- sumshtr(P5, P7, R2, max);
- raznshtr(R1, R2, C11, max);
- sumshtr(P3, P5, C12, max);
- sumshtr(P2, P4, C21, max);
- sumshtr(P1, P2, R1, max);
- sumshtr(P3, P6, R2, max);
- sumshtr(R1, R2, C22, max);
- }
- else
- {
- sumshtr(A11, A22, R1, max);
- sumshtr(B11, B22, R2, max);
- umshtr(R1, R2, P1, max);
- sumshtr(A21, A22, R1, max);
- umshtr(R1, B11, P2, max);
- raznshtr(B12, B22, R1, max);
- umshtr(A22, R1, P3, max);
- raznshtr(B21, B11, R1, max);
- umshtr(A22, R1, P4, max);
- sumshtr(A11, A12, R1, max);
- umshtr(R1, B22, P5, max);
- raznshtr(A21, A11, R1, max);
- sumshtr(B11, B12, R2, max);
- umshtr(R1, R2, P6, max);
- raznshtr(A12, A22, R1, max);
- sumshtr(B21, B22, R2, max);
- umshtr(R1, R2, P7, max);
- sumshtr(P1, P4, R1, max);
- sumshtr(P5, P7, R2, max);
- raznshtr(R1, R2, C11, max);
- sumshtr(P3, P5, C12, max);
- sumshtr(P2, P4, C21, max);
- sumshtr(P1, P2, R1, max);
- sumshtr(P3, P6, R2, max);
- sumshtr(R1, R2, C22, max);
- }
- for (i = 0; i < max; i++)
- for (j = 0; i < max; j++)
- {
- C[i][j] = C11[i][j];
- }
- for (i = 0; i < max; i++)
- for (j = max; i < max * 2; j++)
- {
- C[i][j] = C12[i][j - max / 2-1];
- }
- for (i = max; i < max * 2; i++)
- for (j = 0; i < max; j++)
- {
- C[i][j] = C21[i - max / 2-1][j];
- }
- for (i = max; i < max * 2; i++)
- for (j = max; i < max * 2; j++)
- {
- C[i][j] = C22[i - max / 2-1][j - max / 2-1];
- }
- }
- void main()
- {
- setlocale(LC_ALL, "RUS");
- printf("\n Введите размер матрицы A (m на n): "); //размер матриц
- if ((scanf_s("%d", &m) == 0) || (m <= 0)) //проверка данных
- {
- printf("\n Данные введены некоректно ");
- printf("\n Для продолжения найдите любую клавишу... ");
- _getch();
- return;
- }
- if ((scanf_s(" %d", &n) == 0) || (n <= 0))
- {
- printf("\n Данные введены некоректно ");
- printf("\n Для продолжения найдите любую клавишу... ");
- _getch();
- return;
- }
- printf("\n Введите размер матрицы B (n на p): ");
- if ((scanf_s("%d", &n1) == 0) || (n1 <= 0))
- {
- printf("\n Данные введены некоректно ");
- printf("\n Для продолжения найдите любую клавишу... ");
- _getch();
- return;
- }
- if (n != n1)
- {
- printf("Нельзя перемножать матрицы такого размера");
- _getch();
- return;
- }
- if ((scanf_s(" %d", &p) == 0) || (p <= 0))
- {
- printf("\n Данные введены некоректно ");
- printf("\n Для продолжения найдите любую клавишу... ");
- _getch();
- return;
- }
- printf("\n Введите значение параметра K: "); //размер матриц
- if ((scanf_s("%d", &k) == 0) || (k <= 0)) //проверка данных
- {
- printf("\n Данные введены некоректно ");
- printf("\n Для продолжения найдите любую клавишу... ");
- _getch();
- return;
- }
- srand(time(NULL));
- for (i = 0; i < m; i++)
- {
- for (j = 0; j < n; j++)
- {
- A[i][j] = -9 + rand() % (9 + 9 + 1);
- }
- }
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < p; j++)
- {
- B[i][j] = -9 + rand() % (9 + 9 + 1);
- }
- }
- if ((n > 30)&((p > 30) || (m > 30)))
- {
- printf("Матрицы имеют слишком большой размер,поэтому вывод не производится");
- }
- else
- {
- printf("\n Матрица А: \n"); //распечатка массива А
- for (i = 0; i < m; i++)
- {
- for (j = 0; j < n; j++)
- {
- printf("%3d ", A[i][j]);
- }
- printf("\n ");
- }
- printf("\n Матрица В:\n"); //распечатка массива В
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < p; j++)
- {
- printf("%3d ", B[i][j]);
- }
- printf("\n ");
- }
- }
- for (i = 0; i < m; i++) //Рассчет матрицы С(умножение матриц А и В)
- {
- for (j = 0; j < p; j++)
- {
- C[i][j] = 0;
- for (r = 0; r < n; r++)
- {
- C[i][j] += A[i][r] * B[r][j];
- um++;
- sum++;
- }
- sum--;
- }
- }
- if ((n > 30)&((p > 30) || (m > 30)))
- {
- printf("Матрицы имеют слишком большой размер,поэтому вывод итоговой матрицы не производится");
- }
- else
- {
- printf("\n Матрица c по определению:\n"); //распечатка матрицы c
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < n; j++)
- {
- printf("%3d ", C[i][j]);
- }
- printf("\n ");
- }
- printf("\n ");
- printf("Количество умножений: %d",um);
- printf("\n ");
- printf("Количество сложений: %d", sum);
- }
- if (m > n) //дополнение до квадратных
- {
- if (m > p)
- {
- max = m;
- }
- else
- {
- max = p;
- }
- }
- else
- {
- if (n > p)
- {
- max = n;
- }
- else
- {
- max = p;
- }
- }
- for (i = m; i < max; i++)
- for (j = n; j < max; j++)
- {
- A[i][j] = 0;
- }
- for (i = n; i < max; i++)
- for (j = p; j < max; j++)
- {
- B[i][j] = 0;
- }
- shtrassen(A,B,C,max);
- printf("\n Матрица C по Штрассену:\n"); //распечатка матрицы c
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < n; j++)
- {
- printf("%3d ", C[i][j]);
- }
- printf("\n ");
- }
- printf("\n Для продолжения найдите любую клавишу... ");
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement