1438 - Razboi: Difference between revisions
Pagină nouă: == Enunţ == În Regatul Numerelor, a început războiul civil. Se dau '''n''' soldați, reprezentați prin '''n''' numere naturale, nu neapărat distincte. Cei '''n''' soldați sunt recrutați în două batalioane adverse, după o lege de recrutare. Această lege are un număr asociat, care este egal cu '''1''' sau '''2'''. Dacă legea este '''1''', atunci soldații care au ultima cifră egală cu 0, 2, 4, 6 și 8 sunt recrutați de primul batalion, iar ceilalți de cel de-a... |
No edit summary |
||
(5 intermediate revisions by 2 users not shown) | |||
Line 6: | Line 6: | ||
Fișierul de intrare '''razboi.in''' conține pe prima linie numerele '''n''' şi '''L''', cu semnificaţiile din enunţ, iar pe a doua linie se găsesc '''n''' numere reprezentând identificatorii celor '''n''' soldați. | Fișierul de intrare '''razboi.in''' conține pe prima linie numerele '''n''' şi '''L''', cu semnificaţiile din enunţ, iar pe a doua linie se găsesc '''n''' numere reprezentând identificatorii celor '''n''' soldați. | ||
== Date de iesire == | == Date de iesire == | ||
Dacă datele sunt introduse corect, în fișier se va afișa: '''"Datele sunt introduse corect."''', apoi fișierul de ieșire '''razboi.out''' va conține pe prima linie cele două numere cerute, separate printr-un spațiu. În cazul în care datele nu respectă restricțiile, se va afișa în fișier: '''"Datele nu corespund restricțiilor impuse."'''. | |||
== Restricții și precizări == | == Restricții și precizări == | ||
* 0 &les ; n &les ; 60 000 | * 0 ⩽ n ⩽ 60 000 | ||
*Numerele din şir < 100 000 | *Numerele din şir < 100 000 | ||
== Exemplul 1 == | == Exemplul 1 == | ||
Line 15: | Line 16: | ||
: 6 17 2 | : 6 17 2 | ||
; razboi.out | ; razboi.out | ||
: Datele introduse | : Datele sunt introduse corect. | ||
: 2 1 | : 2 1 | ||
== Explicație == | == Explicație == | ||
Line 28: | Line 29: | ||
: 15 150 12 36 45 78 85 95 93 141 | : 15 150 12 36 45 78 85 95 93 141 | ||
; razboi.out | ; razboi.out | ||
: Datele introduse | : Datele sunt introduse corect. | ||
: 4 6 | : 4 6 | ||
== Explicație == | == Explicație == | ||
Line 41: | Line 42: | ||
: 15 150 12 36 45 78 85 95 93 14 | : 15 150 12 36 45 78 85 95 93 14 | ||
; razboi.out | ; razboi.out | ||
: Datele sunt introduse corect. | |||
: 9 1 | : 9 1 | ||
== Rezolvare == | == Rezolvare == | ||
Line 46: | Line 48: | ||
def sd(n): | def sd(n): | ||
s = 0 | s = 0 | ||
for i in range(1, int(n**0.5)+1): | for i in range(1, int(n**0.5)+1): # se iterează prin toate numerele de la 1 la rădăcina pătrată a lui n | ||
if n % i == 0: | if n % i == 0: # dacă i divide n | ||
s += i + n // i | s += i + n // i # se adaugă i și n/i la sumă | ||
if i * i == n: | if i * i == n: # dacă i este rădăcina pătrată a lui n | ||
s -= i | s -= i # se scade i din sumă, deoarece a fost adăugat de două ori (de la i și de la n/i) | ||
return s | return s | ||
Line 56: | Line 58: | ||
def validare_date(numar1, numar2): | def validare_date(numar1, numar2): | ||
flag = False | flag = False | ||
if numar1.isdigit() and numar2.isdigit(): | if numar1.isdigit() and numar2.isdigit(): # se verifică dacă cele două numere sunt formate din cifre | ||
if 0 < int(numar1) <= 60000 and 0 < int(numar2) <= 100000: | if 0 < int(numar1) <= 60000 and 0 < int(numar2) <= 100000: # se verifică dacă cele două numere sunt în intervalele cerute | ||
flag = True | flag = True | ||
return flag | return flag | ||
Line 64: | Line 66: | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
with open('razboi.in', 'r') as f: | with open('razboi.in', 'r') as f: | ||
n, L = f.readline().split() | n, L = f.readline().split() # se citesc primele două numere din fișierul 'razboi.in' | ||
soldati = list(map(int, f.readline().split())) | soldati = list(map(int, f.readline().split())) # se citesc soldații din fișierul 'razboi.in' și se transformă din string-uri în numere întregi | ||
if validare_date(n, L): | if validare_date(n, L): # se validează cele două numere citite din fișier | ||
n = int(n) | n = int(n) # se transformă n din string în număr întreg | ||
L = int(L) | L = int(L) # se transformă L din string în număr întreg | ||
cnt = 0 | cnt = 0 | ||
for x in soldati: | for x in soldati: | ||
if sd(x) % 2 == 0: | if sd(x) % 2 == 0: # se verifică dacă suma divizorilor lui x este pară | ||
cnt += 1 | cnt += 1 # se incrementează cnt dacă suma divizorilor este pară | ||
with open('razboi.out', 'w') as f: | with open('razboi.out', 'w') as f: | ||
f.write(str(cnt) + ' ' + str(n - cnt) + '\n') | f.write("Datele sunt introduse corect.\n") | ||
f.write(str(cnt) + ' ' + str(n - cnt) + '\n') # se scriu în fișierul 'razboi.out' numărul de soldați cu suma divizorilor pară și numărul de soldați cu suma divizorilor impară | |||
else: | else: | ||
f.write("Datele nu corespund restricțiilor impuse.") # scrierea mesajului de eroare în fișierul de ieșire | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 10:56, 25 April 2023
Enunţ[edit | edit source]
În Regatul Numerelor, a început războiul civil. Se dau n soldați, reprezentați prin n numere naturale, nu neapărat distincte. Cei n soldați sunt recrutați în două batalioane adverse, după o lege de recrutare. Această lege are un număr asociat, care este egal cu 1 sau 2. Dacă legea este 1, atunci soldații care au ultima cifră egală cu 0, 2, 4, 6 și 8 sunt recrutați de primul batalion, iar ceilalți de cel de-al doilea. Dacă legea e 2, atunci soldații care au suma divizorilor număr par sunt recrutați de primul batalion, iar restul de cel de-al doilea.
Cerinţa[edit | edit source]
Dându-se n, numărul de soldați, L, legea de recrutare, și identificatorii celor n soldați, să se afișeze numărul soldaților din primul, respectiv al doilea batalion.
Date de intrare[edit | edit source]
Fișierul de intrare razboi.in conține pe prima linie numerele n şi L, cu semnificaţiile din enunţ, iar pe a doua linie se găsesc n numere reprezentând identificatorii celor n soldați.
Date de iesire[edit | edit source]
Dacă datele sunt introduse corect, în fișier se va afișa: "Datele sunt introduse corect.", apoi fișierul de ieșire razboi.out va conține pe prima linie cele două numere cerute, separate printr-un spațiu. În cazul în care datele nu respectă restricțiile, se va afișa în fișier: "Datele nu corespund restricțiilor impuse.".
Restricții și precizări[edit | edit source]
- 0 ⩽ n ⩽ 60 000
- Numerele din şir < 100 000
Exemplul 1[edit | edit source]
- razboi.in
- 3 2
- 6 17 2
- razboi.out
- Datele sunt introduse corect.
- 2 1
Explicație[edit | edit source]
Suma divizorilor lui 6 este 12. Suma divizorilor lui 17 este 18. Suma divizorilor lui 2 este 3.
Așadar, primul batalion are doi soldați, iar al doilea batalion are unul singur.
Exemplu2[edit | edit source]
- razboi.in
- 10 1
- 15 150 12 36 45 78 85 95 93 141
- razboi.out
- Datele sunt introduse corect.
- 4 6
Explicație[edit | edit source]
Suma divizorilor lui 6 este 12. Suma divizorilor lui 17 este 18. Suma divizorilor lui 2 este 3.
Așadar, primul batalion are doi soldați, iar al doilea batalion are unul singur.
Exemplu3[edit | edit source]
- razboi.in
- 10 2
- 15 150 12 36 45 78 85 95 93 14
- razboi.out
- Datele sunt introduse corect.
- 9 1
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def sd(n):
s = 0 for i in range(1, int(n**0.5)+1): # se iterează prin toate numerele de la 1 la rădăcina pătrată a lui n if n % i == 0: # dacă i divide n s += i + n // i # se adaugă i și n/i la sumă if i * i == n: # dacă i este rădăcina pătrată a lui n s -= i # se scade i din sumă, deoarece a fost adăugat de două ori (de la i și de la n/i) return s
def validare_date(numar1, numar2):
flag = False if numar1.isdigit() and numar2.isdigit(): # se verifică dacă cele două numere sunt formate din cifre if 0 < int(numar1) <= 60000 and 0 < int(numar2) <= 100000: # se verifică dacă cele două numere sunt în intervalele cerute flag = True return flag
if __name__ == '__main__':
with open('razboi.in', 'r') as f: n, L = f.readline().split() # se citesc primele două numere din fișierul 'razboi.in' soldati = list(map(int, f.readline().split())) # se citesc soldații din fișierul 'razboi.in' și se transformă din string-uri în numere întregi
if validare_date(n, L): # se validează cele două numere citite din fișier n = int(n) # se transformă n din string în număr întreg L = int(L) # se transformă L din string în număr întreg
cnt = 0 for x in soldati: if sd(x) % 2 == 0: # se verifică dacă suma divizorilor lui x este pară cnt += 1 # se incrementează cnt dacă suma divizorilor este pară with open('razboi.out', 'w') as f: f.write("Datele sunt introduse corect.\n") f.write(str(cnt) + ' ' + str(n - cnt) + '\n') # se scriu în fișierul 'razboi.out' numărul de soldați cu suma divizorilor pară și numărul de soldați cu suma divizorilor impară else: f.write("Datele nu corespund restricțiilor impuse.") # scrierea mesajului de eroare în fișierul de ieșire
</syntaxhighlight>