Advertisement
NastyaPopova_27

Штр

Oct 21st, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.23 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. #define N 100
  8.  
  9. 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;
  10.  
  11.  
  12.  
  13. void umshtr(int A[N][N], int B[N][N],int C[N][N], int max)
  14. {
  15.     for (i = 0; i < max; i++)
  16.     {
  17.         for (j = 0; j < max; j++)
  18.         {
  19.             C[i][j] = 0;
  20.             for (r = 0; r < max; r++)
  21.             {
  22.                 C[i][j] += A[i][r] * B[r][j];
  23.                 umsh++;
  24.                 sumsh++;
  25.             }
  26.             sumsh--;
  27.         }
  28.     }
  29. }
  30.  
  31. void sumshtr(int A[N][N], int B[N][N], int C[N][N],int max)
  32. {
  33.     for (i = 0; i < max; i++)
  34.     {
  35.         for (j = 0; j < max; j++)
  36.         {
  37.             C[i][j] = A[i][j] + B[i][j];
  38.             sumsh++;
  39.         }
  40.     }
  41. }
  42.  
  43. void raznshtr(int A[N][N], int B[N][N], int C[N][N], int max)
  44. {
  45.     for (i = 0; i < max; i++)
  46.     {
  47.         for (j = 0; j < max; j++)
  48.         {
  49.             C[i][j] = A[i][j] - B[i][j];
  50.             sumsh++;
  51.         }
  52.     }
  53. }
  54.  
  55.  
  56. int shtrassen(int A[N][N],int B[N][N], int C[N][N],int max)
  57. {
  58.     int A11[N][N], A12[N][N], A21[N][N], A22[N][N];
  59.     int B11[N][N], B12[N][N], B21[N][N], B22[N][N];
  60.     int C11[N][N], C12[N][N], C21[N][N], C22[N][N];
  61.     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];
  62.  
  63.     if (max % 2 == 1)
  64.     {
  65.         max++;
  66.         for (i = 0; i < max; i++)
  67.         {
  68.             A[i][max] = 0;
  69.             B[i][max] = 0;
  70.         }
  71.         for (j = 0; j < max; j++)
  72.         {
  73.             A[max][j] = 0;
  74.             B[max][j] = 0;
  75.         }
  76.     }
  77.  
  78.     if (max > k)
  79.     {
  80.        
  81.         for (i = 0; i < max/2; i++)
  82.         {
  83.             for (j = 0; j < max/2; j++)
  84.             {
  85.                 A11[i][j] = A[i][j];
  86.                 B11[i][j] = B[i][j];
  87.             }
  88.         }
  89.  
  90.         for (i = 0; i < max/2; i++)
  91.         {
  92.             for (j = max/2; j < max; j++)
  93.             {
  94.                 A12[i][j-max/2] = A[i][j];
  95.                 B12[i][j-max/2] = B[i][j];
  96.             }
  97.         }
  98.         for (i = max/2; i < max; i++)
  99.         {
  100.             for (j = 0; j < max/2; j++)
  101.             {
  102.                 A21[i- max / 2][j] = A[i][j];
  103.                 B21[i- max / 2][j] = B[i][j];
  104.             }
  105.         }
  106.         for (i = max/2; i < max; i++)
  107.         {
  108.             for (j = max/2; j < max; j++)
  109.             {
  110.                 A22[i-max / 2][j - max / 2] = A[i][j];
  111.                 B22[i - max / 2][j - max / 2] = B[i][j];
  112.             }
  113.         }
  114.    
  115.  
  116.         sumshtr(A11,A22,R1, max);
  117.         sumshtr(B11, B22,R2, max);
  118.         shtrassen(R1, R2, P1, max/2);
  119.  
  120.         sumshtr(A21, A22, R1, max);
  121.         shtrassen(R1, B11, P2, max/2);
  122.  
  123.        
  124.         raznshtr(B12, B22, R1, max);
  125.         shtrassen(A22, R1, P3, max/2);
  126.  
  127.         raznshtr(B21, B11, R1, max);
  128.         shtrassen(A22, R1, P4, max/2);
  129.  
  130.         sumshtr(A11, A12, R1, max);
  131.         shtrassen(R1, B22, P5, max/2);
  132.  
  133.         raznshtr(A21, A11, R1, max);
  134.         sumshtr(B11, B12, R2, max);
  135.         shtrassen(R1, R2, P6, max/2);
  136.  
  137.         raznshtr(A12, A22, R1, max);
  138.         sumshtr(B21, B22, R2, max);
  139.         shtrassen(R1, R2, P7, max/2);
  140.  
  141.         sumshtr(P1, P4, R1, max);
  142.         sumshtr(P5, P7, R2, max);
  143.         raznshtr(R1, R2, C11, max);
  144.  
  145.         sumshtr(P3, P5, C12, max);
  146.  
  147.         sumshtr(P2, P4, C21, max);
  148.  
  149.         sumshtr(P1, P2, R1, max);
  150.         sumshtr(P3, P6, R2, max);
  151.         sumshtr(R1, R2, C22, max);
  152.     }
  153.     else
  154.     {
  155.         sumshtr(A11, A22, R1, max);
  156.         sumshtr(B11, B22, R2, max);
  157.         umshtr(R1, R2, P1, max);
  158.  
  159.         sumshtr(A21, A22, R1, max);
  160.         umshtr(R1, B11, P2, max);
  161.  
  162.         raznshtr(B12, B22, R1, max);
  163.         umshtr(A22, R1, P3, max);
  164.  
  165.         raznshtr(B21, B11, R1, max);
  166.         umshtr(A22, R1, P4, max);
  167.  
  168.         sumshtr(A11, A12, R1, max);
  169.         umshtr(R1, B22, P5, max);
  170.  
  171.         raznshtr(A21, A11, R1, max);
  172.         sumshtr(B11, B12, R2, max);
  173.         umshtr(R1, R2, P6, max);
  174.  
  175.         raznshtr(A12, A22, R1, max);
  176.         sumshtr(B21, B22, R2, max);
  177.         umshtr(R1, R2, P7, max);
  178.  
  179.         sumshtr(P1, P4, R1, max);
  180.         sumshtr(P5, P7, R2, max);
  181.         raznshtr(R1, R2, C11, max);
  182.  
  183.         sumshtr(P3, P5, C12, max);
  184.  
  185.         sumshtr(P2, P4, C21, max);
  186.  
  187.         sumshtr(P1, P2, R1, max);
  188.         sumshtr(P3, P6, R2, max);
  189.         sumshtr(R1, R2, C22, max);
  190.     }
  191.  
  192.     for (i = 0; i < max; i++)
  193.         for (j = 0; i < max; j++)
  194.         {
  195.             C[i][j] = C11[i][j];
  196.         }
  197.     for (i = 0; i < max; i++)
  198.         for (j = max; i < max * 2; j++)
  199.         {
  200.             C[i][j] = C12[i][j - max / 2-1];
  201.         }
  202.     for (i = max; i < max * 2; i++)
  203.         for (j = 0; i < max; j++)
  204.         {
  205.             C[i][j] = C21[i - max / 2-1][j];
  206.         }
  207.     for (i = max; i < max * 2; i++)
  208.         for (j = max; i < max * 2; j++)
  209.         {
  210.             C[i][j] = C22[i - max / 2-1][j - max / 2-1];
  211.         }
  212. }
  213.  
  214. void main()
  215. {
  216.     setlocale(LC_ALL, "RUS");
  217.    
  218.     printf("\n Введите размер матрицы A (m на n): ");                  //размер матриц
  219.     if ((scanf_s("%d", &m) == 0) || (m <= 0))                    //проверка данных
  220.     {
  221.         printf("\n Данные введены некоректно ");
  222.         printf("\n Для продолжения найдите любую клавишу... ");
  223.         _getch();
  224.         return;
  225.     }
  226.     if ((scanf_s(" %d", &n) == 0) || (n <= 0))
  227.     {
  228.         printf("\n Данные введены некоректно ");
  229.         printf("\n Для продолжения найдите любую клавишу... ");
  230.         _getch();
  231.         return;
  232.     }
  233.  
  234.     printf("\n Введите размер матрицы B (n на p): ");
  235.     if ((scanf_s("%d", &n1) == 0) || (n1 <= 0))
  236.     {
  237.         printf("\n Данные введены некоректно ");
  238.         printf("\n Для продолжения найдите любую клавишу... ");
  239.         _getch();
  240.         return;
  241.     }
  242.     if (n != n1)
  243.     {
  244.         printf("Нельзя перемножать матрицы такого размера");
  245.         _getch();
  246.         return;
  247.     }
  248.     if ((scanf_s(" %d", &p) == 0) || (p <= 0))
  249.     {
  250.         printf("\n Данные введены некоректно ");
  251.         printf("\n Для продолжения найдите любую клавишу... ");
  252.         _getch();
  253.         return;
  254.     }
  255.  
  256.     printf("\n Введите значение параметра K: ");                  //размер матриц
  257.     if ((scanf_s("%d", &k) == 0) || (k <= 0))                    //проверка данных
  258.     {
  259.         printf("\n Данные введены некоректно ");
  260.         printf("\n Для продолжения найдите любую клавишу... ");
  261.         _getch();
  262.         return;
  263.     }
  264.  
  265.     srand(time(NULL));
  266.     for (i = 0; i < m; i++)
  267.     {
  268.         for (j = 0; j < n; j++)
  269.         {
  270.             A[i][j] = -9 + rand() % (9 + 9 + 1);
  271.         }
  272.     }
  273.  
  274.     for (i = 0; i < n; i++)
  275.     {
  276.         for (j = 0; j < p; j++)
  277.         {
  278.             B[i][j] = -9 + rand() % (9 + 9 + 1);
  279.         }
  280.     }
  281.  
  282.     if ((n > 30)&((p > 30) || (m > 30)))
  283.     {
  284.         printf("Матрицы имеют слишком большой размер,поэтому вывод не производится");
  285.     }
  286.     else
  287.     {
  288.         printf("\n Матрица А: \n");  //распечатка массива А
  289.         for (i = 0; i < m; i++)
  290.         {
  291.             for (j = 0; j < n; j++)
  292.             {
  293.                 printf("%3d ", A[i][j]);
  294.             }
  295.             printf("\n ");
  296.         }
  297.  
  298.         printf("\n Матрица В:\n");   //распечатка массива В
  299.         for (i = 0; i < n; i++)
  300.         {
  301.             for (j = 0; j < p; j++)
  302.             {
  303.                 printf("%3d ", B[i][j]);
  304.             }
  305.             printf("\n ");
  306.         }
  307.  
  308.     }
  309.  
  310.  
  311.  
  312.     for (i = 0; i < m; i++)       //Рассчет матрицы С(умножение матриц А и В)
  313.     {
  314.         for (j = 0; j < p; j++)
  315.         {
  316.             C[i][j] = 0;
  317.             for (r = 0; r < n; r++)
  318.             {
  319.                 C[i][j] += A[i][r] * B[r][j];
  320.                 um++;
  321.                 sum++;
  322.             }
  323.             sum--;
  324.         }
  325.     }
  326.    
  327.  
  328.     if ((n > 30)&((p > 30) || (m > 30)))
  329.     {
  330.  
  331.         printf("Матрицы имеют слишком большой размер,поэтому вывод итоговой матрицы не производится");
  332.     }
  333.     else
  334.     {
  335.         printf("\n Матрица c по определению:\n");   //распечатка матрицы c
  336.         for (i = 0; i < n; i++)
  337.         {
  338.             for (j = 0; j < n; j++)
  339.             {
  340.                 printf("%3d ", C[i][j]);
  341.             }
  342.             printf("\n ");
  343.         }
  344.         printf("\n ");
  345.         printf("Количество умножений: %d",um);
  346.         printf("\n ");
  347.         printf("Количество сложений: %d", sum);
  348.     }
  349.  
  350.  
  351.    
  352.     if (m > n)                       //дополнение до квадратных
  353.     {
  354.         if (m > p)
  355.         {
  356.             max = m;
  357.         }
  358.         else
  359.         {
  360.             max = p;
  361.         }
  362.     }
  363.     else
  364.     {
  365.         if (n > p)
  366.         {
  367.             max = n;
  368.         }
  369.         else
  370.         {
  371.             max = p;
  372.         }
  373.     }
  374.  
  375.     for (i = m; i < max; i++)
  376.         for (j = n; j < max; j++)
  377.         {
  378.             A[i][j] = 0;
  379.         }
  380.     for (i = n; i < max; i++)
  381.         for (j = p; j < max; j++)
  382.         {
  383.             B[i][j] = 0;
  384.         }
  385.    
  386.         shtrassen(A,B,C,max);
  387.  
  388.     printf("\n Матрица C по Штрассену:\n");   //распечатка матрицы c
  389.     for (i = 0; i < n; i++)
  390.     {
  391.         for (j = 0; j < n; j++)
  392.         {
  393.             printf("%3d ", C[i][j]);
  394.         }
  395.         printf("\n ");
  396.     }
  397.  
  398.    
  399.  
  400.     printf("\n Для продолжения найдите любую клавишу... ");
  401.     _getch();
  402. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement