Advertisement
Bibodui

Лаба 4 ЯМП

Dec 21st, 2020
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1. /*
  2. * Задача 17.
  3. Даны целые M и N и вектор действительных чисел X[1..N].
  4. Найти целое число i (1<=i<=N-M), для которого сумма x[i]+...+x[i+M] ближе всего к нулю.
  5. */
  6.  
  7. #include <iostream>
  8. #include <vector>
  9. #include <fstream>
  10. #include <Windows.h>
  11. #include <ctime>
  12.  
  13. using namespace std;
  14.  
  15. void MergeSort(vector<double>&, int, int);
  16. void Merge(vector<double>&, int, int);
  17.  
  18. int main()
  19. {
  20.     int exit;
  21.  
  22.     do
  23.     {
  24.         SetConsoleOutputCP(1251);
  25.         SetConsoleCP(1251);
  26.  
  27.         srand(static_cast<unsigned int>(time(0)));
  28.  
  29.         vector<double> X, S;
  30.  
  31.         int M, N, i = -1;
  32.         cout << "Введите M:" << endl;
  33.         cin >> M;
  34.         cout << "Введите N:" << endl;
  35.         cin >> N;
  36.  
  37.         cout << "Вектор X:" << endl;
  38.         for (int j = 0; j < N; j++)
  39.         {
  40.             X.push_back((rand() % 100 + (rand() % 100)/100.0));
  41.             cout << X[j] << '\t';
  42.             if (!((j + 1) % 20))
  43.                 cout << endl;
  44.         }
  45.         cout << endl;
  46.  
  47.         double S1;
  48.  
  49.         cout << "Вектор сумм:" << endl;
  50.         for (int j = 0; j < N - M; j++)
  51.         {
  52.             S1 = 0;
  53.             for (int k = j; k <= j + M; k++)
  54.             {
  55.                 S1 += X[k];
  56.             }
  57.             S.push_back(S1);
  58.             cout << S[j] << '\t';
  59.             if (!((j + 1) % 20))
  60.                 cout << endl;
  61.         }
  62.         cout << endl;
  63.  
  64.         double min = S[0];
  65.  
  66.         for (int j = 1; j < N - M; j++)
  67.         {
  68.             if (min > S[j])
  69.             {
  70.                 min = S[j];
  71.                 i = j;
  72.             }
  73.         }
  74.  
  75.         cout << endl << "i = " << i << endl;
  76.  
  77.         cout << endl << endl << endl << "////////////Второй способ решения////////////" << endl << endl << endl << endl;
  78.  
  79.  
  80.         MergeSort(X, 0, N-1);
  81.  
  82.         for (int j = 0; j < N; j++)
  83.         {
  84.             cout << X[j] << '\t';
  85.             if (!((j + 1) % 20))
  86.                 cout << endl;
  87.         }
  88.         cout << endl;
  89.  
  90.         cout << "Следовательно i = 0" << endl;
  91.  
  92.         cout << "0. Выход" << endl;
  93.         cin >> exit;
  94.     } while (exit != 0);
  95. }
  96.  
  97. void MergeSort(vector<double>& array, int left, int right)
  98. {
  99.     if (left < right)
  100.         if (right - left == 1)
  101.         {
  102.             if (array[left] > array[right])
  103.                 swap(array[left], array[right]);
  104.         }
  105.         else
  106.         {
  107.             MergeSort(array, left, left + (right - left) / 2);
  108.             MergeSort(array, left + (right - left) / 2 + 1, right);
  109.             Merge(array, left, right);
  110.         }
  111. }
  112.  
  113. void Merge(vector<double>& array, int begin, int end)
  114. {
  115.     int i = begin,
  116.         mid = begin + (end - begin) / 2,
  117.         j = mid + 1,
  118.         k = 0;
  119.     double d[1000];
  120.  
  121.     while (i <= mid && j <= end)
  122.     {
  123.         if (array[i] <= array[j])
  124.         {
  125.             d[k] = array[i];
  126.             i++;
  127.         }
  128.         else
  129.         {
  130.             d[k] = array[j];
  131.             j++;
  132.         }
  133.         k++;
  134.     }
  135.  
  136.     while (i <= mid)
  137.     {
  138.         d[k] = array[i];
  139.         i++;
  140.         k++;
  141.     }
  142.  
  143.     while (j <= end)
  144.     {
  145.         d[k] = array[j];
  146.         j++;
  147.         k++;
  148.     }
  149.  
  150.     for (i = 0; i < k; i++)
  151.         array[begin + i] = d[i];
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement