3009 - ZTS: Difference between revisions
Cuceu Andrei (talk | contribs) Pagină nouă: ==Cerință== Fie '''Z''' un număr natural în baza '''10'''. Considerăm '''rkrk-1 … r1r0''' scrierea numărului '''Z''' în baza '''3'''. Fie '''T = rkrk−1…r1r0''' numărul în baza 10 format cu cifrele rk, rk-1, … r1, r0. Notăm cu '''S''' restul împărțirii numărului '''T '''la''' 7'''. Se dau '''N''' numere naturale '''Z1, Z2, … , ZN'''. Pentru fiecare dintre numerele '''Z1, Z2, … , ZN''' se cere să se calculeze '''S1, S2, … , SN'''. ('''Si '''reprezi... |
Vardai Erwin (talk | contribs) |
||
(4 intermediate revisions by the same user not shown) | |||
Line 13: | Line 13: | ||
==Date de ieșire== | ==Date de ieșire== | ||
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." | |||
Programul va afișa pe ecran, pe câte o linie, numerele '''S1, S2, … , SN'''. | Programul va afișa pe ecran, pe câte o linie, numerele '''S1, S2, … , SN'''. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse." | ||
==Restricții și precizări== | ==Restricții și precizări== | ||
Line 24: | Line 23: | ||
==Exemplul 1== | ==Exemplul 1== | ||
;''' Intrare ''' | ;''' Intrare ''' | ||
:2 | |||
:19 30 | |||
;'''Ieșire ''' | ;'''Ieșire ''' | ||
:Datele de intrare corespund restricțiilor impuse. | |||
:5 | |||
:2 | |||
==Explicație== | |||
== | |||
S-au citit '''2''' numere:''' 19''' și '''30'''. | S-au citit '''2''' numere:''' 19''' și '''30'''. | ||
Numărul '''19''' în baza '''3''' se scrie: '''201.''' Restul împărțirii numărului '''201''' la '''7''' este '''5'''. | Numărul '''19''' în baza '''3''' se scrie: '''201.''' Restul împărțirii numărului '''201''' la '''7''' este '''5'''. | ||
Numărul '''30''' în baza '''3''' se scrie: '''1010.''' Restul împărțirii numărului '''1010''' la '''7''' este '''2'''. | Numărul '''30''' în baza '''3''' se scrie: '''1010.''' Restul împărțirii numărului '''1010''' la '''7''' este '''2'''. | ||
==Rezolvare== | ==Rezolvare== | ||
Line 73: | Line 68: | ||
if __name__ == '__main__': | |||
# Citim numarul de intrari si numerele Z1, Z2, ..., ZN | # Citim numarul de intrari si numerele Z1, Z2, ..., ZN | ||
N = int(input()) | N = int(input()) | ||
Line 80: | Line 75: | ||
# Validam datele de intrare | # Validam datele de intrare | ||
if not validate_input(N, Z): | if not validate_input(N, Z): | ||
print("Datele de intrare nu corespund restricțiilor impuse.") | |||
else: | |||
print("Datele de intrare corespund restricțiilor impuse.") | |||
# Calculam resturile S1, S2, ..., SN | |||
S = calculate_S(Z) | |||
# Afisam rezultatele | |||
for s in S: | |||
print(s) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
==Explicație== | |||
== | |||
Primul pas în rezolvarea problemei este să citim numărul de intrări și numerele Z1, Z2, ..., ZN de la intrare, iar apoi să le validăm. Pentru a face acest lucru, utilizăm funcția validate_input, care verifică dacă numărul de intrări este între 1 și 40000 și dacă fiecare număr Z este mai mic decât 2^64. Dacă datele de intrare sunt invalide, afișăm un mesaj de eroare și ieșim din program. În caz contrar, continuăm cu calcularea resturilor. | Primul pas în rezolvarea problemei este să citim numărul de intrări și numerele Z1, Z2, ..., ZN de la intrare, iar apoi să le validăm. Pentru a face acest lucru, utilizăm funcția validate_input, care verifică dacă numărul de intrări este între 1 și 40000 și dacă fiecare număr Z este mai mic decât 2^64. Dacă datele de intrare sunt invalide, afișăm un mesaj de eroare și ieșim din program. În caz contrar, continuăm cu calcularea resturilor. |
Latest revision as of 17:14, 7 May 2023
Cerință[edit | edit source]
Fie Z un număr natural în baza 10. Considerăm rkrk-1 … r1r0 scrierea numărului Z în baza 3. Fie T = rkrk−1…r1r0 numărul în baza 10 format cu cifrele rk, rk-1, … r1, r0. Notăm cu S restul împărțirii numărului T la 7. Se dau N numere naturale Z1, Z2, … , ZN. Pentru fiecare dintre numerele Z1, Z2, … , ZN se cere să se calculeze S1, S2, … , SN. (Si reprezintă restul împărțirii la 7 a numărului Ti iar Tireprezintă numărul format cu cifrele scrierii în baza 3 a numărului Zi).
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul N, iar apoi N numere naturale Z1, Z2, … , ZN, separate prin spații.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." Programul va afișa pe ecran, pe câte o linie, numerele S1, S2, … , SN. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."
Restricții și precizări[edit | edit source]
- 1 ≤ N ≤ 40000
- Z1, Z2, … , ZN vor fi mai mici decât 2^64
Exemplul 1[edit | edit source]
- Intrare
- 2
- 19 30
- Ieșire
- Datele de intrare corespund restricțiilor impuse.
- 5
- 2
Explicație[edit | edit source]
S-au citit 2 numere: 19 și 30. Numărul 19 în baza 3 se scrie: 201. Restul împărțirii numărului 201 la 7 este 5. Numărul 30 în baza 3 se scrie: 1010. Restul împărțirii numărului 1010 la 7 este 2.
Rezolvare[edit | edit source]
Rezolvare ver. 1[edit | edit source]
<syntaxhighlight lang="python" line="1" start="1">
def validate_input(N, Z):
if N < 1 or N > 40000: print("Numarul de intrare trebuie sa fie intre 1 si 40000") return False for z in Z: if z >= 2**64: print("Numarul ", z, " este prea mare") return False return True
def calculate_S(Z):
S = [] for z in Z: base_3 = [] while z > 0: base_3.append(z % 3) z //= 3 T = 0 for i in range(len(base_3)): T += base_3[i] * (3 ** i) S.append(T % 7) return S
if __name__ == '__main__':
# Citim numarul de intrari si numerele Z1, Z2, ..., ZN N = int(input()) Z = list(map(int, input().split()))
# Validam datele de intrare if not validate_input(N, Z): print("Datele de intrare nu corespund restricțiilor impuse.") else: print("Datele de intrare corespund restricțiilor impuse.") # Calculam resturile S1, S2, ..., SN S = calculate_S(Z) # Afisam rezultatele for s in S: print(s)
</syntaxhighlight>
Explicație[edit | edit source]
Primul pas în rezolvarea problemei este să citim numărul de intrări și numerele Z1, Z2, ..., ZN de la intrare, iar apoi să le validăm. Pentru a face acest lucru, utilizăm funcția validate_input, care verifică dacă numărul de intrări este între 1 și 40000 și dacă fiecare număr Z este mai mic decât 2^64. Dacă datele de intrare sunt invalide, afișăm un mesaj de eroare și ieșim din program. În caz contrar, continuăm cu calcularea resturilor.
Funcția calculate_S primește un vector de numere întregi Z și calculează vectorul de resturi S. Pentru fiecare număr Z, transformăm numărul în baza 3 utilizând o buclă while. Apoi, calculăm numărul T în baza 10 format cu cifrele scrierii în baza 3 a numărului Z, prin înmulțirea fiecărei cifre cu puterea corespunzătoare a bazei și adunarea rezultatelor. Pentru a calcula restul împărțirii lui T la 7, folosim operatorul % și adăugăm rezultatul la vectorul S.
În funcția main, citim datele de intrare, le validăm și apoi calculăm resturile utilizând funcția calculate_S. În cele din urmă, afișăm vectorul de resturi.