1438 - Razboi: Difference between revisions

From Bitnami MediaWiki
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 ==
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 ⩽ n ⩽  60 000
* 0 ⩽ n ⩽  60 000
Line 15: Line 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 ==  
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 corespund restricțiilor impuse.
: 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ă
        print("Datele introduse corespund restricțiilor impuse.")
         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>

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>