# PBinfo #1618 – Cifre12 – Rezolvare C++

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

## Enunț

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


Numărul de segmente aprinse pentru afișarea numărului N.
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.

## Cod sursă C++

```cpp
// 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<<"\n";
    }
    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<<"\n";
    }
    f.close();
    g.close();
    return 0;
}
```

## Resurse

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