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:
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.
Răspunsuri la întrebare
Răspuns:
#include <fstream>
using namespace std;
ifstream cin("forus.in");
ofstream cout("forus.out");
int main()
{
int n,a,cer,nrcif=0,put1=1,put2=10,ca,nr,cnt=0,ok=0;
int nrdiv,minrdiv=2100000000,minr=2100000000;
cin>>cer>>n;
if (cer==1)
{
for (int i=0; i<n; i++)
{
cin>>a;
while (a>0)
{
if (a%10==0)
{
ok=1;
break;
}
else
a=a/10;
}
if (ok==0)
cnt++;
ok=0;
}
cout<<cnt;
}
if(cer==2)
{
for(int i=0; i<n; i++)
{
cin>>a;
ca=a;
put1=1;
put2=10;
nrcif=0;
while(ca>9)
{
put1=put1*10;
nrcif++;
ca/=10;
}
nrcif++;
for(int j=0; j<nrcif; j++)
{
if(a%put2>=put2/10)
{
nr=(a%put2)*put1+a/put2;
nrdiv=0;
for(int d=1; d*d<=nr; d++)
{
if(nr%d==0)
nrdiv+=2;
if(d*d==nr)
nrdiv--;
}
if(nrdiv<minrdiv)
{
minrdiv=nrdiv;
minr=nr;
}
else if(nrdiv==minrdiv)
{
if(nr<minr)
minr=nr;
}
}
put1=put1/10;
put2=put2*10;
}
cout<<minr<<" ";
nrdiv=0;
minrdiv=2100000000;
minr=2100000000;
}
}
return 0;
}