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 .
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!