Cerința ---> #1608 Sortare Divizori pbinfo (va rog ajutor am nevoie de 100 pct. C++)
Se dau n numere naturale nenule. Ordonați descrescător cele n numere după numărul lor de divizori.
Date de intrare
Fișierul de intrare sortare_divizori.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin câte un spațiu.
Date de ieșire
Fișierul de ieșire sortare_divizori.out va conține cele n numere aflate pe a doua linie a fișierului de intrare ordonate descrescător după numărul de divizori.
Restricții și precizări
1 ≤ n ≤ 1000
numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000
dacă există mai multe numere care au același număr de divizori, acestea vor fi ordonate crescător
Exemplu:
sortare_divizori.in:
5
12 20 4 100 13
sortare_divizori.out:
100 12 20 4 13
Explicație:
12 are 6 divizori, 20 are 6 divizori, 4 are 3 divizori, 100 are 9 divizori, 13 are 2 divizori, 12 și 20 au același număr de divizori. Așadar ordinea va fi 100 12 20 4 13.
Răspunsuri la întrebare
Răspuns de
4
#include <bits/stdc++.h>
using namespace std;
ifstream fin("sortare_divizori.in");
ofstream fout("sortare_divizori.out");
int n,a[1001],b[1001];
unsigned long Count(unsigned long a);
int main()
{
fin >> n;
for(int i=1;i<=n;i++)
{
fin >> a[i];
b[i]=Count(a[i]);
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
if(b[i]<b[j])
{
swap(b[i],b[j]);
swap(a[i],a[j]);
}
else if(b[i]==b[j])
if(a[i]>a[j])
swap(a[i],a[j]);
}
for(int i=1;i<=n;i++)
cout << a[i] << " ";
return 0;
}
unsigned long Count(unsigned long a)
{
unsigned long count = 1, k = 0, i;
if (a == 1 || a == 2)
return a;
while ((a & 1) == 0)
{
k++;
a >>= 1;
}
if (a == 1)
return k + 1;
else
count = k + 1;
for(i = 3; i*i <= a; i += 2)
{
k = 0;
while(a % i == 0)
{
k++;
a /= i;
}
count *= (k + 1);
}
if (a > 1)
count <<= 1;
return count;
}
using namespace std;
ifstream fin("sortare_divizori.in");
ofstream fout("sortare_divizori.out");
int n,a[1001],b[1001];
unsigned long Count(unsigned long a);
int main()
{
fin >> n;
for(int i=1;i<=n;i++)
{
fin >> a[i];
b[i]=Count(a[i]);
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
if(b[i]<b[j])
{
swap(b[i],b[j]);
swap(a[i],a[j]);
}
else if(b[i]==b[j])
if(a[i]>a[j])
swap(a[i],a[j]);
}
for(int i=1;i<=n;i++)
cout << a[i] << " ";
return 0;
}
unsigned long Count(unsigned long a)
{
unsigned long count = 1, k = 0, i;
if (a == 1 || a == 2)
return a;
while ((a & 1) == 0)
{
k++;
a >>= 1;
}
if (a == 1)
return k + 1;
else
count = k + 1;
for(i = 3; i*i <= a; i += 2)
{
k = 0;
while(a % i == 0)
{
k++;
a /= i;
}
count *= (k + 1);
}
if (a > 1)
count <<= 1;
return count;
}
stassahul:
Este necesar sa rezolvi prin metoda bulelor, in caz contrar limita depasita. Daca nuti place algoritmul pentru aflarea numarul de divizori, il foloseste pe acel din solutia oficiala.
Alte întrebări interesante
Istorie,
8 ani în urmă
Matematică,
8 ani în urmă
Franceza,
8 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă