Sunteți pe pagina 1din 6

Fisa probleme rezolvate VECTORI

#130
Se dă un vector cu n elemente numere întregi. Să se ordoneze crescător elementele unui
vector crescător după suma cifrelor.

Date de intrare
Fişierul de intrare sortcif.in conţine pe prima linie numărul n si pe a doua linie n numere
întregi separate prin spaţii.

Date de ieşire
Fişierul de ieşire sortcif.out va conţine pe prima linie cele n elemente ale vectorului,
ordonate conform cerinței, separate printr-un spațiu.
sortcif.in

6
89 22 91 4005 51 721

sortcif.out

22 51 4005 91 721 89

#include <iostream>

#include <fstream>

using namespace std;

ifstream fin("sortcif.in");

ofstream fout("sortcif.out");

int main()

Int n, x,j,s1, v[101],s[101];

fin >> n;

for(int i = 1; i <= n; i++)

fin >> v[i];


x=v[i];

s1=0;

do{

s1=s1+x%10;

x/=10;

} while(x!=0);

s[i]=s1;

for(int i = 1; i < n; i++)

for(int j = i + 1; j <= n; j++)

if(s[i] > s[j])

swap(s[i],s[j]);

swap(v[i],v[j]);

for(int i = 1; i <= n; i++)

fout << v[i] << " ";


}

#131 Se dă un vector cu n elemente numere întregi.

Cerinţa
Să se ordoneze crescător elementele unui vector crescător după prima cifră.

Date de intrare
Fişierul de intrare sortcif2.in conţine pe prima linie numărul n si pe a doua linie n numere întregi
separate prin spaţii.

Date de ieşire
Fişierul de ieşire sortcif2.out va conţine pe prima linie cele n elemente ale vectorului, ordonate
conform cerinței, separate printr-un spațiu.
sortcif2.in

6
89 2246 91 4005 51 721

sortcif2.out

2246 4005 51 721 89 91

#include <iostream>

#include <fstream>

using namespace std;

ifstream fin("sortcif2.in");

ofstream fout("sortcif2.out");

int n;

int main()

int x,j, v[101],s[101];

fin >> n;

for(int i = 1; i <= n; i++)

fin >> v[i];

x=v[i];

while(x>9)

x/=10;

s[i]=x; //fac vector cu prima cifra a fiecarui numar

for(int i = 1; i < n; i++)

for(int j = i + 1; j <= n; j++)


if(s[i] > s[j])

swap(s[i],s[j]);

swap(v[i],v[j]);

for(int i = 1; i <= n; i++)

fout << v[i] << " ";


}
#1608 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.

Obs: dacă există mai multe numere care au același număr de divizori, acestea vor fi
ordonate crescător

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.

#include <iostream>

#include <fstream>

#include <algorithm>
using namespace std;

ifstream fin("sortare_divizori.in");

ofstream fout("sortare_divizori.out");

int v[1001],p,i,n,x,a[1001],b[1001],nr_div,j,d;

int main()

fin>>n;

for(i=1; i<=n; i++)

fin>>a[i];

x=a[i];

//calculez nr de divizori ai lui x pe baza formulei: (p1+1)(p2+1).......(pn+1) unde x=d1 p1 * d2p2*....dkpk

d=2; //folosesc alg eficient de desc in factori primi pentru a nu avea limita de timp depasita

nr_div=1;

while(d*d<=x)

p=0;

while (x%d==0)

p++;

x=x/d;

if(p!=0)

nr_div=nr_div*(p+1);

d++;

if(x!=1)

nr_div=nr_div*(1+1);

b[i]=nr_div;//construiesc vect b in care pun in b[i] nr de divizori ai lui a[i]

for (i=1; i<=n-1; i++) //ordonez desc vect b, inversand cand este cazul simultan si elementele din vect a
for(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]) //daca 2 numere au acealsi nr de divizori le ordonez crescator

if(a[i]>a[j])

swap(a[i],a[j]);

for(i=1; i<=n; i++)

fout<<a[i]<<" ";

return 0;

Obs: Daca numararea divizorilor lui a[i] se facea cu algoritmul

x=a[i];

nr_div=0;

for(d=1;d*d<x;d++)

if(x%d==0)

nr_div=nr_div+2;

if(d*d==x)

nr_div=nr_div+1;

punctajul obtinut era 90p (limita de timp depasita!)

S-ar putea să vă placă și