Advertisement
MeehoweCK

Untitled

Nov 2nd, 2020
1,995
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int suma_wektora(vector<int> wektor)
  7. {
  8.     int suma = 0;
  9.     unsigned n = wektor.size();
  10.     for(unsigned i = 0; i < n; ++i)
  11.         suma += wektor[i];
  12.     return suma;
  13. }
  14.  
  15. int dopelnienie_wektora(vector<int> wektor, int suma)
  16. {
  17.     int wynik = 0;
  18.     unsigned n = wektor.size();
  19.     for(unsigned i = 0; i < n - 1; ++i)
  20.         wynik += wektor[i];
  21.     return suma - wynik;
  22. }
  23.  
  24. int maks_wartosc(vector<int> wektor, unsigned pozycja, int suma)
  25. {
  26.     unsigned n = wektor.size();
  27.     int wynik = 2;
  28.     for(unsigned i = 0; i < n - 1; ++i)
  29.     {
  30.         if(i == pozycja)
  31.             continue;
  32.         wynik += wektor[i];
  33.     }
  34.     return suma - wynik;
  35. }
  36.  
  37. void wypisz_wektor(vector<int> wektor)
  38. {
  39.     unsigned n = wektor.size();
  40.  
  41.     for(unsigned i = 0; i < n; ++i)
  42.         cout << wektor[i] << '\t';
  43.     cout << endl;
  44. }
  45.  
  46. vector<int> nastepny_wektor(vector<int> wektor)
  47. {
  48.     unsigned n = wektor.size();
  49.     int suma = suma_wektora(wektor);
  50.  
  51.     if(n == suma / 2)       // jeżeli liczba elementów jest równa suma / 2, to znaczy, że w wektorze są same dwójki - jest to ostatni wektor
  52.     {
  53.         vector<int> wynik;
  54.         wynik.resize(0);
  55.         return wynik;       // zwracamy pusty wektor
  56.     }
  57.  
  58.     bool flaga = false;
  59.     for(int poz = n - 2; poz >= 0; --poz)
  60.     {
  61.         if(wektor[poz] < maks_wartosc(wektor, poz, suma))
  62.         {
  63.             wektor[poz] += 2;       // jeśli jest jeszcze "miejsce" na zwiększenie wartości, zwiększamy ją o 2
  64.             wektor[n - 1] = dopelnienie_wektora(wektor, suma);      // dopełniamy ostatni element wektora
  65.             flaga = true;           // stawiamy flagę informującą, że doszło do operacji
  66.             break;                  // wychodzimy z pętli
  67.         }
  68.         else                        // jeśli nie ma miejsca na zwiększenie wartości
  69.         {
  70.             wektor[poz] = 2;        // ustawiamy najmniejszą wartość (2) po czym przechodzimy na pozycję o 1 mniejszą
  71.         }
  72.     }
  73.     if(flaga)
  74.         return wektor;              // jeśli doszło do zmiany, zwracamy zmieniony wektor
  75.  
  76.     // jeśli nie doszło do żadnych zmian, generujemy nowy wektor, większy o jeden element
  77.     vector<int> wynik;
  78.     ++n;
  79.     wynik.resize(n);
  80.  
  81.     for(unsigned i = 0; i < n; ++i)
  82.         wynik[i] = 2;
  83.     wynik[n - 1] = dopelnienie_wektora(wynik, suma);
  84.     return wynik;
  85. }
  86.  
  87. int main()
  88. {
  89.     vector<int> wektor;
  90.     wektor.push_back(20);
  91.  
  92.     while(wektor.size() > 0)
  93.     {
  94.         wypisz_wektor(wektor);
  95.         wektor = nastepny_wektor(wektor);
  96.     }
  97.  
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement