1438 - Razboi: Diferență între versiuni
(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...) |
Fără descriere a modificării |
||
(Nu s-au afișat 5 versiuni intermediare efectuate de alți 2 utilizatori) | |||
Linia 6: | Linia 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 == | ||
Linia 15: | Linia 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 == | ||
Linia 28: | Linia 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 == | ||
Linia 41: | Linia 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 == | ||
Linia 46: | Linia 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 | ||
Linia 56: | Linia 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 | ||
Linia 64: | Linia 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> |
Versiunea curentă din 25 aprilie 2023 10:56
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-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
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
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
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
- 0 ⩽ n ⩽ 60 000
- Numerele din şir < 100 000
Exemplul 1
- razboi.in
- 3 2
- 6 17 2
- razboi.out
- Datele sunt introduse corect.
- 2 1
Explicație
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
- razboi.in
- 10 1
- 15 150 12 36 45 78 85 95 93 141
- razboi.out
- Datele sunt introduse corect.
- 4 6
Explicație
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
- razboi.in
- 10 2
- 15 150 12 36 45 78 85 95 93 14
- razboi.out
- Datele sunt introduse corect.
- 9 1
Rezolvare
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