1438 - Razboi: Difference between revisions

From Bitnami 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...
 
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 ==
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 ==
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ă
 
         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>