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
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
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 valoareaV = 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
<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>