👤

Cerința Valentin, elev în clasa a V-a, e fascinat de cifre. Îi place să mute cifrele unui număr de pe o poziție pe alta. Astfel, pentru un număr N și o cifră k, mută toate cifrele egale cu k la început, după care așază celelalte cifre în ordinea în care apăreau în N. Desigur, există și situații în care numărul cifrelor lui N se micșorează sau situații în care numărul N nu se modifică. De exemplu, dacă numărul N este 134112 și cifra k este 1, după mutarea cifrelor se obține 111342. Pornind de la numărul N și cifra k știți ce număr obține Valentin? Scrieţi un program care să citească numărul natural N şi cifra k și care să determine: a) de câte ori apare cifra k în numărul N; (30% din punctaj) b) numărul obținut după modificarea numărului N; (70% din punctaj) Date de intrare Pe prima linie a fișierului cifre006.in se află numărul natural N și cifra k separate printr-un spațiu. Date de ieșire Fișierul de ieșire cifre006.out va conține două valori, fiecare pe câte un rând. Prima valoare este numărul de cifre k existente în N, iar a doua valoare este numărul obținut din N după modificare.

Răspuns :

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

   long long int N, copie, k, rep=0, cif, i;

   long long int m=0, ncif=0, z=1;

   ifstream f("cifre006.in");

   ofstream g("cifre006.out");

   f >> N >> k;

   copie=N;

   while (copie)

   {

      cif=copie%10; if (cif==k) { ++rep; m=m*10+cif;}

      copie=copie/10; ++ncif;

   }

   for (cif=1; cif<ncif; ++cif)

       z=z*10;

   g << rep  << "\n";

   if (rep==0) m=N;

   else {

   copie=N; i=0;

   while (i<ncif)

   {

       ++i;

       cif=copie/z;

       if (cif != k)

       { if (cif != 0) m=m*10+cif;

           else m*=10; }

       copie=copie%z; z=z/10;

   }}

   g << m << "\n";

   f.close();  g.close();

   return 0;

}