👤

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


Răspuns :

function f(a:integer):integer;
var i:integer;
begin

 for i:=1 to a do 
  if (a mod i = 0) then
   f+=1;
   
end;

var 
 
 a,b,c:array of integer;
 i,n,maxd,max,min,l:integer;
 t:text;
 
begin

 assign(t,'sortare_divizori.in');
 reset(t);
 
 readln(t,n);
 setlength(a,n);
 setlength(b,n);
 setlength(c,n);
 
 for i:=0 to n-1 do
  read(t,a[i]);
  
 close(t);
 
 min:=a[1];
 max:=a[2];
 
 for i:=0 to n-1 do
  begin
  if a[i]<min then min:=a[i];
  if a[i]>max then max:=a[i];
  end;
  
 l:=0;
 
 for min:=min to max do 
  for i:=0 to n-1 do 
   if a[i]=min then 
    begin
    c[l]:=min;
    inc(l);
    end;
 
 assign(t,'sortare_divizori.out');
 rewrite(t);
 
 for i:=0 to n-1 do
  b[i]:=f(c[i]);
  
 maxd:=b[1];
 
 for i:=0 to n-1 do 
  if b[i]>maxd then maxd:=b[i];
  
 for maxd:=maxd downto 0 do 
  for i:=0 to n-1 do 
   begin
   if b[i]=maxd then write(t,c[i],' ');
   end;

 close(t);
 
end.