1618 - Cifre 12
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ă:
- 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ăruluiN
, 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 valoareaV = 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">
- 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>