Rezolvare completă PbInfo #1440 nr

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.

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

#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;
}


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 #1440 nr

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