Problema de pe pbinfo #1138:

Maria a aflat că numerele naturale care încep cu cifra 1 și au toate cifrele ordonate strict crescător şi consecutive sau încep cu cifra 9 și au toate cifrele ordonate strict descrescător şi consecutive se numesc numere speciale. Interesată să descopere legătura dintre numerele speciale cu același număr de cifre, a observat că poate construi tabelul alăturat.
Scrieţi un program care citind patru numere naturale K, N, A şi B determină:
1) cel mai mare număr special situat în tabel pe linia K;
2) numărul special obţinut din numărul N prin ştergerea unei cifre;
3) numărul de numere speciale din mulțimea {A , A +1, A+2, A+3…,B-1,B}.
Date de intrare:
Fișierul de intrare speciale.in conține pe prima linie un număr natural P. Pentru toate testele de intrare, numărul P poate avea doar valoarea 1, valoarea 2 sau valoarea 3. Pe a doua linie a fișierului speciale.in se găsesc, în această ordine, numerele naturale K, N, A și B, separate prin câte un spațiu.
Date de ieșire:
Dacă valoarea lui P este 1, se va rezolva numai punctul 1) din cerințe. În acest caz, fişierul de ieşire speciale.out va conține pe prima linie un număr natural reprezentând cel mai mare număr special situat în tabel pe linia K.
Dacă valoarea lui P este 2, se va rezolva numai punctul 2) din cerințe. În acest caz, fişierul de ieşire speciale.out va conține pe prima linie un număr natural reprezentând numărul special obţinut din numărul N prin ştergerea unei cifre sau 0 dacă un astfel de număr nu se poate obţine;
Dacă valoarea lui P este 3, se va rezolva numai punctul 3) din cerințe. În acest caz, fişierul de ieşire speciale.out va conține pe prima linie un număr natural reprezentând numărul de numere speciale din mulțimea {A , A +1, A+2, A+3…,B-1,B}.
Restricții și precizări:
1 ≤ K ≤ 9
1 ≤ N ≤ 999999999
1 ≤ A ≤ B ≤ 999999999
Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, pentru rezolvarea corectă a celei de a doua cerințe se acordă 40 de puncte, pentru rezolvarea corectă a celei de a treia cerințe se acordă 40 de puncte.

Problema De Pe Pbinfo 1138 Maria A Aflat Că Numerele Naturale Care Încep Cu Cifra 1 Și Au Toate Cifrele Ordonate Strict Crescător Şi Consecutive Sau Încep Cu Ci class=

Răspuns :

COROANA TE ROG!!!

#include <fstream>  

using namespace std;

ifstream f("speciale.in");

ofstream g("speciale.out");

int main() {

   int k, n, a, b, x = 0, i, pr, nr=0, nr1=0, p1, fin_nr, ok = 0, nr2, p;

   f >> p >> k >> n >> a >> b;

   if (p == 1) {

       x = 0;

       for (i = 9; i > 9 - k; i--)

           x = i + x * 10;

       g << x << '\n';

   }

   //cerinta 2

   if (p == 2) {

       pr = n;

       while (pr) {

           pr = pr / 10;

           nr++;

       }

       nr--;

       for (i = 1; i <= nr; i++)

           nr1 = i + nr1 * 10;

       p1 = 0;

       pr = n;

       fin_nr = nr1;

       while (pr) {

           if (pr % 10 == nr1 % 10) {

               pr = pr / 10;

               nr1 = nr1 / 10;

           }

           else {

               p1++;

               pr = pr / 10;

           }

       }

       if (p1 == 1) {

           g << fin_nr << '\n';

           ok = 1;

       }

       else {

           nr1 = 0;

           for (i = 9; i > 9 - nr; i--)

               nr1 = i + nr1 * 10;

           p1 = 0;

           pr = n;

           fin_nr = nr1;

           while (pr) {

               if (pr % 10 == nr1 % 10) {

                   pr = pr / 10;

                   nr1 = nr1 / 10;

               }

               else {

                   p1++;

                   pr = pr / 10;

               }

           }

           if (p1 == 1) {

               g << fin_nr << '\n';

               ok = 1;

           }

       }

       if (ok == 0) g << 0 << '\n';

   }

   //cerinta 3

   if (p == 3) {

       nr = 0;

       pr = a;

       nr1 = 0;

       while (pr) {

           pr = pr / 10;

           nr++;

       }

       for (i = 1; i <= nr; i++)

           nr1 = i + nr1 * 10;

       nr2 = 0;

       for (i = 9; i > 9 - nr; i--)

           nr2 = i + nr2 * 10;

       x = 0;

       if (nr1 >= a) x++;

       if (nr2 >= a && nr2 <= b) x++;

       nr++;

       pr = nr2 % 10 - 1;

       while (nr2 < b && nr1 < b) {

           nr2 = nr2 * 10 + pr;

           nr1 = nr1 * 10 + nr;

           nr++;

           pr--;

           if (nr1 <= b) x++;

           if (nr2 <= b) x++;

       }

       g << x << '\n';

   }

   f.close();

   g.close();

   return 0;

}