1438 - Razboi: Diferență între versiuni

De la Universitas MediaWiki
(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 ==
Fișierul de ieșire '''razboi.out''' va conține pe prima linie cele două numere cerute, separate printr-un spațiu.
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 corespund restricțiilor impuse.
: 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 corespund restricțiilor impuse.
: 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:
         print("Datele de intrare nu corespund restricțiilor impuse.")
         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