# PBinfo #1440 – nr – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Se generează un şir de numere naturale ai cărui primi termeni sunt, în această ordine:
1, 20, 21, 300, 301, 320, 321, 4000, 4001, 4020, 4021, 4300, 4301, 4320, 4321, 50000,...
Deduceţi regula după care sunt generaţi termenii şirului şi scrieţi un program care să citească numerele naturale k, n şi x şi care să determine:
a) numărul de termeni ai şirului care au prima cifră (cea mai semnificativă) egală cu k;
b) cel de-al n-lea termen al şirului din enunţ;
c) cel mai mare termen al şirului, mai mic sau egal decât x.

Date de intrare
Fișierul de intrare nr.in conține o singură linie pe care sunt scrise trei numere naturale k, n şi x, separate prin câte un spaţiu.

Date de ieșire
Fişierul de ieşire nr.out va conţine 3 linii:
– pe prima linie se va scrie un număr natural reprezentând numărul de termeni ai şirului care au prima cifră (cea mai semnificativă) egală cu k;
– pe a doua linie se va scrie un număr natural reprezentând cel de-al n-lea termen al şirului din enunţ;
– pe a treia linie se va scrie un număr natural reprezentând cel mai mare termen al şirului, mai mic sau egal cu x.

Restricții și precizări

1 ≤ k ≤ 9
3 ≤ n ≤ 511
1 ≤ x ≤ 2.000.000.000

Exemplu:
nr.in

4 19 57890
nr.out

8
50021
54321
Explicație
Pe prima linie a fişierului nr.out se scrie numărul 8, deoarece sunt 8 termeni în şir care au prima cifră egală cu k=4).
Pe a doua linie a fişierului se scrie numărul 50021, deoarece cel de-al n-lea (n=19) termen al şirului este 50021.
Numerele 54321 şi 600000 sunt doi termeni situaţi pe poziţii consecutive în şirul din enunţ, iar 54321 ≤ 57890 < 600000. Astfel, numărul 54321 se scrie pe ultima linie a fişierului nr.out.

## Cod sursă C++

```cpp
#include <fstream>
#include <cmath>
using namespace std;
int main()
{
    ifstream f("nr.in");
    ofstream g("nr.out");
    long x,z,p=1,y;
    int n,k,c,i,j;
    f>>k>>n>>x;
// cerinta a)
    z=(long)pow(2,k-1);
    g<<z<<endl;
    //cerinta b)
    z=0;
    i=1;
    do
    {
        c=n%2;
        if(c!=0)z=z+i*p;
        p=p*10;
        i++;
        n=n/2;
    }
    while (n>0);
    g<<z<<endl;
    //cerinta c
    z=1;
    for(j=2; (j<=511) && (z<x); j++)
    {
        n=j;
        p=1;
        y=z;
        z=0;
        i=1;
        do
        {
            c=n%2;
            if(c!=0)z=z+i*p;
            p=p*10;
            i++;
            n=n/2;
        }
        while (n>0);
    }
    if((z==x)||(j==512)) g<<z;
    else g<<y;
    g<<endl;
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1440)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1440/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1440/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
