Advertisement
MeehoweCK

Untitled

Feb 23rd, 2024
652
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. // sortuje rosnąco ciąg liczb od podanej pozycji do końca
  5. void sortuj(std::vector<short int>& cyfry, const short int pozycja = 0) {
  6.     auto n{ cyfry.size() };
  7.     for (short int i = 0; i < n - pozycja - 1; ++i) {
  8.         for (short int j = pozycja; j < n - i - 1; ++j) {
  9.             if (cyfry[j] > cyfry[j + 1]) {
  10.                 std::swap(cyfry[j], cyfry[j + 1]);
  11.             }
  12.         }
  13.     }
  14. }
  15.  
  16. // generuje ciąg cyfr ułożonych rosnąco z podanej liczby
  17. std::vector<short int> wygeneruj_pierwszy_ciag(unsigned long long liczba) {
  18.     std::vector<short int> wynik{};
  19.     while (liczba > 0) {
  20.         wynik.push_back(liczba % 10);
  21.         liczba /= 10;
  22.     }
  23.     sortuj(wynik);
  24.     return wynik;
  25. }
  26.  
  27. // przekształca ciąg cyfr na liczbę
  28. unsigned long long wygeneruj_liczbe_z_ciagu(const std::vector<short int>& ciag) {
  29.     unsigned long long wynik{};
  30.     const auto size{ ciag.size() };
  31.     for (auto i{ 0 }; i < size; ++i) {
  32.         wynik = wynik * 10 + ciag[i];
  33.     }
  34.     return wynik;
  35. }
  36.  
  37. // znajduję pozycję ostatniej cyfry mniejszej od następującej po niej lub -1 jeśli takiej nie ma
  38. short int znajdz_najmniejsza(const std::vector<short int>& ciag) {
  39.     for (auto i{ static_cast<short int>(ciag.size() - 2) }; i >= 0; --i) {
  40.         if (ciag[i] < ciag[i + 1]) {
  41.             return i;
  42.         }
  43.     }
  44.     return -1;
  45. }
  46.  
  47. // znajduję pozycję najmniejszej z cyfr większych od ciag[k] stojących po k
  48. short int znajdz_nastepna_wieksza(const std::vector<short int>& ciag, const short int& k) {
  49.     const auto size{ ciag.size() };
  50.     auto pozycja{ k + 1 };
  51.     for (auto i{ k + 2 }; i < size; ++i) {
  52.         if (ciag[i] > ciag[k] && ciag[i] < ciag[pozycja]) {
  53.             pozycja = i;
  54.         }
  55.     }
  56.     return static_cast<short int>(pozycja);
  57. }
  58.  
  59. bool wygeneruj_nastepny_ciag(std::vector<short int>& ciag) {
  60.     const auto k{ znajdz_najmniejsza(ciag) };
  61.     if (k == -1) {
  62.         return false;
  63.     }
  64.     const auto n{ znajdz_nastepna_wieksza(ciag, k) };
  65.     std::swap(ciag[n], ciag[k]);
  66.     sortuj(ciag, k + 1);
  67.     return true;
  68. }
  69.  
  70. // sprawdza ile jest liczb złożonych z cyfr liczby a podzielnych przez b
  71. int ile_liczb(const unsigned long long& a, const int& b) {
  72.     int wynik{};
  73.     auto ciag{ wygeneruj_pierwszy_ciag(a) };
  74.     do {
  75.         if (wygeneruj_liczbe_z_ciagu(ciag) % b == 0) {
  76.             ++wynik;
  77.         }
  78.     } while (wygeneruj_nastepny_ciag(ciag));
  79.     return wynik;
  80. }
  81.  
  82. int main() {
  83.     unsigned long long a;
  84.     int b;
  85.     std::cout << "Podaj dwie liczby calkowite (oddzielone spacja): ";
  86.     std::cin >> a >> b;
  87.     std::cout << ile_liczb(a, b) << std::endl;
  88.  
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement