1618 - Cifre 12

From Bitnami MediaWiki
Revision as of 17:05, 16 February 2024 by Raul (talk | contribs) (Pagină nouă: Un indicator numeric este un dispozitiv de afişaj electronic destinat afişării unei cifre zecimale. Acesta conține <code>7</code> segmente notate cu <code>a</code>, <code>b</code>, <code>c</code>, <code>d</code>, <code>e</code>, <code>f</code>, <code>g</code>, ca în figura de mai jos. Afişarea unei cifre se face prin aprinderea unei combinații de segmente conform tabelului: {| class="wikitable" !Cifră !0 !1 !2 !3 !4 !5 !6 !7 !8 !9 |- |Segmente aprinse |a,b,c,d,e,f...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemplul 1[edit | edit source]

cifre12.in

1 
823

cifre12.out

17

Explicație[edit | edit source]

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[edit | edit source]

cifre12.in

2
823

cifre12.out

5

Explicație[edit | edit source]

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[edit | edit source]

Lipește codul aici[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 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()

</syntaxhighlight>