Informatică, întrebare adresată de Ra29, 8 ani în urmă

Cerința
Un șir de numere aparțin unui divigrup dacă au același număr de divizori. Scrieți un
program care citește un număr natural N și apoi N numere naturale nenule și care
determină:
a. câte divigrupuri există în șirul de numere citite
b. numărul de numere din fiecare divigrup, urmat de numerele ce aparțin acestuia, în ordine
crescătoare.
Date de intrare
Fișierul de intrare divigrup.in conține pe prima linie numărul N, iar pe a doua
linie N numere naturale separate prin spații.
Date de ieșire
Fișierul de ieșire divigrup.out va conține pe prima linie numărul K, reprezentând numărul
de divigrupuri ce se pot forma cu numerele de pe a doua linie a fișierului de intrare.
Pe următoarele K rânduri se vor descrie divigrupurile în ordine descrescătoare a numărului
de divizori ai elementelor ce le aparțin, astfel încât fiecare rând va avea următoarea
structură: M – numărul de elemente ale divigrupului – x 1 x 2 x 3 … x M – numerele aparținând
divigrupului, în ordine crescătoare. Valorile scrise pe un rând vor fi separate prin câte un
spațiu.
Restricții și precizări
 1 ≤ n ≤ 200
 numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1000000000

Exemplu
divigrup.in
11
21 99 15 9 24 100 45 28 44 4 36

divigrup.out
5
2 36 100
1 24
4 28 44 45 99
2 15 21
2 4 9
Explicație
Există 5 divigrupuri care sunt descrise pe următoarele 5 rânduri: primul divigrup format
din 36 și 100, care au același număr maxim de divizori, următorul divigrup are un singur
element, pe 24 care are 8 divizori, al treilea divigrup format
din 28, 44, 45 și 99 are 4 elemente, toate având 6 divizori, șamd.
O rezolvare la nivel de clasa a 9 a va rog!

Răspunsuri la întrebare

Răspuns de holqvire
0

#include <iostream>

#include <map>

#include <vector>

#include <algorithm>

using namespace std;

int divisors(int x) {

 int cnt = 0;

 for (int i = 1; i <= x; i++) {

   if (x % i == 0) {

     cnt++;

   }

 }

 return cnt;

}

int main() {

 int n;

 cin >> n;

 int a[n];

 map<int, vector<int> > m;

 for (int i = 0; i < n; i++) {

   cin >> a[i];

   int d = divisors(a[i]);

   m[d].push_back(a[i]);

 }

 cout << m.size() << endl;

 for (auto it = m.rbegin(); it != m.rend(); it++) {

   sort(it->second.begin(), it->second.end());

   cout << it->second.size() << " ";

   for (int i = 0; i < it->second.size(); i++) {

     cout << it->second[i] << " ";

   }

   cout << endl;

 }

 return 0;

}

Alte întrebări interesante