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
# 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()