Rezolvare completă PbInfo #1138 Speciale

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.

Cerinţe

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.

Exemplul 1

speciale.in

1
3 125345 320 888888

speciale.out

987

Explicație

P = 1, pentru acest test, se rezolva cerința 1). Numerele speciale de pe linia a treia a tabelului sunt 123 și 987, cel mai mare fiind 987.

Exemplul 2

speciale.in

2
3 125345 320 888888

speciale.out

12345

Explicație

P = 2, pentru acest test, se rezolva cerința 2). Ștergând cifra 5 aflată pe poziția a treia în 125345 se obține numărul special 12345.

Exemplul 3

speciale.in

3
3 125345 320 888888

speciale.out

6

Explicație

P = 3, pentru acest test, se rezolvă cerința 3). Sunt 6 numere speciale în mulțimea {320, 321,..., 888888} și anume 987, 1234, 9876, 12345, 98765, 123456

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

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cassert>
#define MRD 999999999
using namespace std;
int K, N, A, P, B, N1, N2, Nr, Na1, Na2, Special, i, p, x, d, u, nr;
bool ok;
int main()
{
    freopen("speciale.in", "r",stdin);
    freopen("speciale.out","w",stdout);
    scanf("%d
",&P);
    scanf("%d%d%d%d",&K, &N, &A, &B);
    assert(P>0 && P<=3 && K<10 && K>0 && N<=MRD && A<=MRD && B<=MRD && N>0 && A>0 && B>0 && A<=B);
    if(P==1){
    for(int i=1; i<=K; i++)
        N2=N2*10 + 10 - i;
    printf("%d
", N2);
    }
    else
    if(P==2){
    p = 1; Special=0;
    while (N/p>0 && !Special){
        Nr=N/(p*10)*p + N%p; int cn=Nr; while (cn>9)cn/=10;
        if(Nr==1 ||Nr == 9) Special = Nr;
        else{
        d=(cn==9? 1: -1);
        u=Nr%10;  ok=true;
        while (Nr>0){
          if ( u != Nr % 10 ) ok=false;
          Nr/=10; u += d;
        }
        if (ok && (d==1 && u==10 || d==-1 && u==0))
                        Special=N/(p*10)*p + N%p;
        }
        p*=10;
    }
    printf("%d
", Special);
    }
    else{
    Na1=Na2=nr=0;
    for(int i=1; i<=9 ; i++ ){
        Na1=Na1*10 + i;
        if(Na1>=A&&Na1<=B ) nr++;
        Na2=Na2*10 + 10 - i;
        if(Na2>=A&&Na2<=B) nr++;
    }
    printf("%d
", nr);
    }
    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 #1138 Speciale

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