1438 - Razboi: Difference between revisions
Diana Butuza (talk | contribs) |
No edit summary |
||
(3 intermediate revisions by the same user 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 ⩽ n ⩽ 60 000 | * 0 ⩽ n ⩽ 60 000 | ||
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>