Rezolvare completă PbInfo #1731 Numar5

Pentru un număr dat cu k cifre \(c_1c_2…c_k\), se numeşte algoritm de deplasare circulară spre dreapta de la o cifră iniţială \(c_i\), la o cifră finală \(c_j\), deplasarea din cifră în cifră spre dreapta de \(c_i\) ori (1≤i,j≤k). Dacă pe parcursul deplasării s-a ajuns la cifra \(c_k\), se continuă deplasarea circulară spre dreapta cu cifra \(c_1\).
Un număr cu k cifre se numeşte număr „circular” dacă îndeplineşte următoarele două cerinţe:

  • toate cifrele sunt nenule;
  • pornind de la cifra \(c_1\), aplicând algoritmul de deplasare circulară spre dreapta de exact k ori, se ajunge din nou la \(c_1\), fiecare dintre cifrele numărului fiind exact o singură dată cifră iniţială.
    De exemplu, numărul 2396 este un număr “circular”, pentru că are doar cifre nenule şi algoritmul de deplasare circulară spre dreapta se aplică astfel:
    1. Se porneşte de la cifra iniţială 2 (2 3 9 6) şi se numără două cifre spre dreapta, ajungând la cifra finală 9: 2 3 9 6.
    2. Se porneşte de la cifra iniţială 9 şi se numără nouă cifre spre dreapta, ajungând la cifra finală 6: 2 3 9 6.
    3. Se porneşte de la cifra iniţială 6 şi se numără şase cifre spre dreapta, ajungând la cifra finală 3: 2 3 9 6.
    4. Se porneşte de la cifra iniţială 3 şi se numără trei cifre spre dreapta, ajungând la cifra finală 2: 2 3 9 6.
    Astfel, se ajunge la prima cifră din număr, adică la cifra 2, după exact 4 aplicări ale algoritmului, iar fiecare dintre cifrele numărului este exact o dată cifră iniţială.

Cerința

Scrieţi un program care citeşte numărul natural nenul n, apoi numerele naturale \(x_1, x_2, …, x_n\), şi determină:
a) cel mai mare număr din şir în care există cel puţin o cifră care apare de minimum două ori, iar în cazul în care în şir nu există un astfel de număr, se va afişa cel mai mare număr din şir;
b) un şir \(a_1, a_2, …, a_n\) de n numere naturale pentru care un element \(a_i\)(1≤i≤n)se calculează astfel:

  • este egal cu \(x_i\) , dacă \(x_i\) este număr circular;
  • este numărul cel mai apropiat de \(x_i\) (număr mai mare sau mai mic decât \(x_i\)), cu proprietatea că este număr circular; dacă pentru un număr din şir se identifică un număr circular y, \( y > x_i\) şi un număr circular z, z<\(x_i\), pentru care \( y – x_i\) = \(x_i – z\), atunci se va alege numărul y.

Date de intrare

Fişierul numar.in conţine pe prima linie numărul n, iar pe următoarele n linii numerele naturale \(x_1, x_2, …, x_n\).

Date de ieșire

Fişierul numar.out va conţine pe prima linie un număr natural determinat conform cerinţei a), iar pe următoarele n linii şirul de numere determinat conform cerinţei de la punctul b), fiecare număr pe câte un rând.

Restricții și precizări

  • 0 < n < 100
  • 9 < \(x_i\) < 999589, 1 ≤ i ≤ n

Exemplu

numar.in

5
15
123
1972
222
515

numar.out

515
15 
117
1959
222
522

Explicație

a) 515 este cel mai mare număr dintre cele cinci numere citite, număr ce conţine o cifră care apare de minimum două ori.
b) Pentru 15: de la cifra iniţială 1, se numără o cifră şi se ajunge la cifra finală 5, apoi începând de la cifra 5 ca cifră iniţială, se numără cinci cifre şi se ajunge la cifra finală 1. Astfel cifrele 1, 5 sunt o singură dată cifre iniţiale şi după două aplicări ale algoritmului de deplasare se ajunge la prima cifră, deci 15 este număr circular.

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 Numar5:

#include <iostream>
#include <fstream>


using namespace std;
ifstream f("numar.in");
ofstream g("numar.out");

long a[10000];
int n;

void date()
{int i;
  f>>n;
  for(i=0;i<n;i++)
   f>>a[i];
  f.close();
}



int cifre_repetate(long x)
{int a[10],i;
for(i=0;i<=9;i++)
     a[i]=0;
while(x)
if (a[x%10]!=0) return 1;
 else {a[x%10]=1;x=x/10;}
return 0;
}

long max()
{int i; long max1,max2;
max1=0;
max2=0;
for(i=0;i<n;i++)
 {if (cifre_repetate(a[i])) 
     if (max2<a[i]) max2=a[i];
  if (max1<a[i]) max1=a[i];
 }
 if (max2==0) return max1;
 else return max2;
}
int este (long x)
{ int i=1,a[100],b[100],k=0,t,z=0,j,ok;

  while (x!=0)
  { a[i]=x%10;
    if (a[i]==0) return 0;
    x/=10;
    b[i++]=1;
   }
   i--;
   for(j=0;j<=i/2;j++)
   {
       z=a[j];
       a[j]=a[i+1-j];
       a[i+1-j]=z;
   }
z=0;
t=a[1];
k=1;ok=1;
for(j=1;j<=i && ok;j++)
 { if(k+t<=i) k=k+t;
   else k=(t-(i-k+1))%i+1;
   if (b[k]!=0)
     {z++;
     b[k]=0;
     }
   else ok=0;
   t=a[k];
}
if (ok) return 1;
 else return 0;
}


int main()
{int p=-1,i,z=0; long t,x,y;
date();
g<<max()<<endl;
z=0;
for(i=0;i<n;i++)
if (este(a[i])) g<<a[i]<<endl;
  else
  {p=0;x=a[i];
  while (!p)
      if (este(x)) p=1;
     else x++;
    p=0;y=a[i];
  while (!p)
      if (este(y)) p=1;
     else y--;
  if ((x-a[i])>(a[i]-y)) g<<y<<endl;
     else g<<x<<endl;
  }
g.close();
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 Adresa de email.

Rezolvarea problemei #1731 Numar5

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1731 Numar5 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!