1618 - Cifre 12

De la Universitas MediaWiki

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.

Încărcare soluție

Lipește codul aici

# Technology stack: C++
import sys

def main():
    n = 0
    N = 0
    S = 0
    P = 0

    # cate segmente are fiecare cifra
    s = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6]

    # cate cifre strict mai mari se pot obtine din cifra curenta prin adaugare
    a = [1, 5, 1, 2, 2, 3, 1, 2, 0, 0]

    # cate cifre se pot obtine din cifra curenta prin adaugare, inclusiv cifra curenta
    b = [2, 7, 2, 3, 3, 4, 2, 5, 1, 2]

    c = 0
    k = 0
    i = 0
    j = 0
    w = [25]
    aux = 0
    v = 0

    f = open("cifre12.in")
    g = open("cifre12.out", "w")
    
    v, n = map(int, f.readline().split())

    if v == 1:
        N = n
        S = 0
        while N > 0:
            c = N % 10
            S += s[c]
            N //= 10
        g.write(str(S) + "\n")

    if v == 2:
        # duc cifrele intr-un vector
        N = n
        k = 0
        while N > 0:
            w[k] = N % 10
            k += 1
            N //= 10

        # reversez vectorul
        i = 0
        j = k - 1
        while i < j:
            aux = w[i]
            w[i] = w[j]
            w[j] = aux
            i += 1
            j -= 1

        S = 0
        i = 0
        while i < k:
            if a[w[i]]:
                P = a[w[i]]
                j = i + 1
                while j < k:
                    P *= b[w[j]]
                    j += 1
                S += P
            i += 1
        g.write(str(S) + "\n")

    f.close()
    g.close()

if __name__ == "__main__":
    main()