La ora de educație tehnologică a clasei a V-a profesorul Forus, pasionat de matematică, a adus pentru fiecare dintre cei N
elevi câte un carton pe care este scris câte un număr natural nenul. Fiecare elev poate folosi cartonul așa cum l-a primit sau poate să taie o singură dată cartonul între două cifre și să lipească partea stângă la finalul părții drepte. Elevul NU are voie să facă o tăietură în fața cifrei 0
, deci niciunul dintre numerele obținute NU poate să înceapă cu cifra 0
. Dintre toate numerele pe care le poate obține, elevul îl alege pe cel care are număr minim de divizori, iar dacă poate obține mai multe astfel de numere, îl alege pe cel mai mic dintre ele. La sfârșitul orei, profesorul strânge cartoanele cu numerele alese, în ordinea distribuirii lor. De exemplu, dacă inițial elevul primește cartonul cu numărul 25082
atunci el are doar următoarele trei variante de tăiere și lipire:
Cerința
Scrieţi un program care citeşte numărul natural N
și cele N
numere scrise pe cartoanele aduse de profesorul Forus, apoi rezolvă următoarele două cerinţe:
1. determină numărul de cartoane pe care elevii au voie să le taie de oriunde (NU conțin cifre în fața cărora NU au voie să taie);
2. determină, în ordinea strângerii cartoanelor, numerele preluate de către profesorul Forus la finalul orei.
Date de intrare
Fișierul de intrare forus.in
conține pe prima linie un număr natural C
reprezentând cerința din problemă care trebuie rezolvată (1
sau 2
). A doua linie din fișier conține un număr natural N
, reprezentând numărul de elevi, iar a treia linie din fișier conţine N
numere naturale, separate prin câte un spațiu, reprezentând numerele scrise pe cartoanele aduse de profesor, în ordinea distribuirii lor.
Date de ieșire
Dacă C = 1
, fişierul de ieşire forus.out
conţine pe prima linie un număr natural reprezentând răspunsul la cerinţa 1.
Dacă C = 2
, fişierul de ieşire forus.out
conţine pe prima linie N
numere naturale, separate prin câte un spațiu, reprezentând răspunsul la cerința 2; numerele sunt scrise în ordinea în care au fost strânse.
Restricții și precizări
2 ≤ N ≤ 30
1 ≤ numărul natural de pe carton < 1 000 000 000
- Pentru rezolvarea corectă a cerinţei 1 se acordă
20
de puncte; pentru rezolvarea corectă a cerinței 2 se acordă70
de puncte. - În concurs s-au acordat
10
puncte din oficiu. Aici se acordă10
puncte pentru exemplele din enunț.
Exemplul 1:
forus.in
1 5 1234 25082 543 52 150
forus.out
3
Explicație
Cerinţa este 1
. Sunt 3
numere care pot fi tăiate de oriunde: 1234
, 543
, 52
.
Exemplul 2:
forus.in
2 5 51 1234 50822 345 150
forus.out
15 2341 25082 453 501
Explicație
Cerinţa este 2
. Pentru cartonul cu numărul 51
se pot obţine numerele 15
și 51
. Ambele numere au câte 4
divizori. Astfel, se va alege numărul 15
, fiind cel mai mic. Pentru cartonul cu numărul 1234
(4
divizori) pot fi obținute numerele: 2341
(2
divizori), 3412
(6
divizori) și 4123
(8
divizori). Se va alege numărul 2341
pentru că are numărul minim de divizori. Analog se va proceda pentru toate celelalte numere din șir.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema forus:
#include <fstream>
using namespace std;
ifstream f("forus.in");
ofstream g("forus.out");
int nrdiv(int N)
{
int d,nrd=1;
for(d=1;d*d<N;d++)
if(N%d==0)nrd+=2;
if(d*d==N) ++nrd;
return nrd;
}
int main()
{
int C,N,nr;
f>>C>>N;
if(C==1)
{
int r=0,ok;
for(int i=1; i<=N; i++)
{
f>>nr;
//cout<<nr<<" ";
ok=1;
while(nr && ok)
{
if (nr%10==0)ok=0;
nr=nr/10;
}
r=r+ok;
}
g<<r<<endl;
}
else
{ int y,p,nrc,x,pr,ult,pu,xmin,nrdm,nrd,z;
for(int i=1; i<=N; i++)
{
f>>nr;
p=1;nrc=1;pu=10;
xmin=nr; nrdm=nrdiv(nr);
x=nr;
while(x>0)
{
x=x/10;
p=p*10;
nrc++;
}
p=p/10;z=p;
for(int i=1; i<nrc; i++)
{
pr=nr/p;
ult=nr%p;
x=ult*pu+pr;
if(x/z>0)
{
nrd=nrdiv(x);
if(nrd<nrdm)
{
xmin=x;
nrdm=nrd;
}
else
if(nrd==nrdm) xmin=min(xmin,x);
}
pu=pu*10;
p=p/10;
}
g<<xmin<<" ";
}
g<<endl;}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2447 forus
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2447 forus de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!