Rezolvare completă PbInfo #1618 Cifre12

Un indicator numeric este un dispozitiv de afişaj electronic destinat afişării unei cifre zecimale.
Acesta conține 7 segmente notate cu a, b, c, d, e, f, g, ca în figura de mai jos.

Afişarea unei cifre se face prin aprinderea unei combinații de segmente conform tabelului:

Cifră 0 1 2 3 4 5 6 7 8 9
Segmente aprinse a,b,c,d,e,f b,c a,b,d,e,g a,b,c,d,g b,c,f,g a,c,d,f,g a,c,d,e,f,g a,b,c a,b,c,d,e,f,g a,b,c,d,f,g

Cerința

Cunoscând un număr natural N afișat cu ajutorul mai multor indicatoare numerice, să se scrie un program care determină:

  1. Numărul de segmente aprinse pentru afișarea numărului N.
  2. Numărul de numere distincte mai mari decât N,ce se pot forma prin aprinderea a cel puțin unui segment în plus, față de cele utilizate pentru afișarea numărului N, fără a folosi alte indicatoare numerice, și fără a stinge niciun segment dintre cele deja aprinse.

Date de intrare

Fișierul de intrare cifre12.in conține pe prima linie numărul natural V a cărui valoare poate fi doar 1 sau 2, iar pe a doua linie numărul natural N.

Date de ieșire

Fișierul de ieșire este cifre12.out.

Dacă valoarea lui V este 1 atunci fişierul de ieşire va conţine pe prima linie un singur număr natural ce reprezintă numărul de segmente aprinse pentru afișarea numărului N.

Dacă valoarea lui V este 2 atunci fişierul de ieşire va conține pe prima linie un singur număr natural reprezentând numărul de numere distincte mai mari decât N, ce se pot forma prin aprinderea a cel puțin unui segment în plus, față de cele utilizate pentru afișarea numărului N, fără a folosi alte indicatoare numerice.

Restricții și precizări

  • 10 ≤ N ≤ 1019
  • 20% din teste vor avea valoarea V = 1, iar 80% din teste vor avea valoarea V = 2.

Exemplul 1

cifre12.in

1 
823

cifre12.out

17

Explicație

V = 1, deci se rezolvă NUMAI prima cerință. N = 823;

Pentru afișarea cifrei 8 s-au aprins 7 segmente, pentru cifra 2 s-au aprins 5 segmente și pentru cifra 3 tot 5 segmente. În total s-au aprins 17 segmente.

Exemplul 2

cifre12.in

2
823

cifre12.out

5

Explicație

V = 2, deci se rezolvă NUMAI a doua cerință. N = 823;

Din cifra 8 nu se mai pot obține alte cifre prin aprinderea de noi segmente.
Din cifra 2 se poate obține cifra 8 iar din cifra 3 se pot obține cifrele 8 și 9 prin aprinderea de noi segmente. Așadar, se pot obține 5 numere mai mari ca 823: 828, 829, 883, 888, 889.

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

// Chesca Ciprian - sursa 100 p
// O((nrcifre(N)^2))


#include <fstream>

using namespace std;

int main()
{
    unsigned long long n,N,S,P;

    // cate segmente are fiecare cifra
    int s[10]={6,2,5,5,4,5,6,3,7,6};

    // cate cifre strict mai mari se pot obtine din cifra curenta prin adaugare
    int a[10]={1,5,1,2,2,3,1,2,0,0};

    // cate cifre se pot obtine din cifra curenta prin adaugare, inclusiv cifra curenta
    int b[10]={2,7,2,3,3,4,2,5,1,2};


    int c,k,i,j,w[25],aux,v;

    ifstream f("cifre12.in");
    ofstream g("cifre12.out");

    f>>v>>n;

    if (v==1)
    {
     N=n;S=0;
     while (N>0)
        {
        c=N%10;
        S=S+s[c];
        N=N/10;
        }
     g<<S<<"
";
    }

    if (v==2)
    {
        // duc cifrele intr-un vector
        N=n;k=0;
        while (N>0)
        {
        w[++k]=N%10;
        N=N/10;
        }
        // reversez vectorul
        for(i=1,j=k;i<j;i++,j--)
        {
        aux=w[i];
        w[i]=w[j];
        w[j]=aux;
        }

        S=0;
        for(i=1;i<=k;i++)
        {
        if (a[w[i]])
            {
            P=a[w[i]];
            for(j=i+1;j<=k;j++)
                P=P*b[w[j]];
            S=S+P;
            }
        }
    g<<S<<"
";
    }
    f.close();
    g.close();

    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 #1618 Cifre12

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