2905 - Divizori 4

From Bitnami MediaWiki
Revision as of 07:39, 7 November 2023 by Zmicala Narcis (talk | contribs) (Pagină nouă: == Cerinţa == Gigel a găsit un șir cu n numere naturale, numerotate de la '''1''' la '''n''' și un număr '''p'''. Neavând chef de muncă, Gigel vă cere să rezolvați următoarele cerințe: a) Aflați câți divizori are numărul din șir aflat pe poziția '''p'''. b) Afișați în ordine descrescătoare numerele din șir care au același număr de divizori ca cel aflat pe poziția '''p'''. == Date de intrare == Fișierul de intrare '''divizori4.in''' conține pe prim...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerinţa

Gigel a găsit un șir cu n numere naturale, numerotate de la 1 la n și un număr p. Neavând chef de muncă, Gigel vă cere să rezolvați următoarele cerințe:

a) Aflați câți divizori are numărul din șir aflat pe poziția p. b) Afișați în ordine descrescătoare numerele din șir care au același număr de divizori ca cel aflat pe poziția p.

Date de intrare

Fișierul de intrare divizori4.in conține pe prima linie numerele n c, unde c poate fi doar 1 sau 2. A doua linie conține cele n elemente ale șirului. A treia linie conține numărul p.

Date de ieşire

Dacă c=1 se rezolvă numai cerința a). Fișierul de ieșire divizori4.out va conține pe prima linie numărul de divizori ai numărului aflat în șir pe poziția p.

Dacă c=2 se rezolvă numai cerința b). Fișierul de ieșire divizori4.out va conține pe prima linie, în ordine descrescătoare, numerele din șir cu același număr de divizori ca și cel aflat pe poziția p.

Restricții și precizări

  • numerele din șir vor fi numere naturale nenule mai mici sau egale cu 1.000.000.000
  • pentru 50% din punctaj c=1; pentru 50% din punctaj c=2;
  • pentru c=1, 1 ≤ p ≤ n ≤ 50.000
  • pentru c=2, 1 ≤ p ≤ n ≤ 50.000 pentru 30% din punctaj și 1 ≤ p ≤ n ≤ 10.000 pentru 20% din punctaj

Exemplul 1

divizori4.in
10 1
1 5 95 23 16 39 77 74 97 57
3
divizori4.out
4

Explicație

c=1, se rezolvă doar cerința a). Al treilea număr din șir este 95, care are 4 divizori (1 5 19 95).

Exemplul 2

divizori4.in
10 2
1 5 95 23 16 39 77 74 97 57
3
divizori4.out
95 77 74 57 39

Explicație

c=2, se rezolvă doar cerința b). Al treilea număr din șir este 95, care are 4 divizori. Numerele cu 4 divizori din șir sunt, în ordine descrescătoare: 95 77 74 57 39.

Rezolvare

<syntaxhighlight lang="python" line> import math

  1. Funcția care calculează numărul de divizori ai unui număr

def numar_divizori(n):

   num_divizori = 0
   for i in range(1, int(math.sqrt(n)) + 1):
       if n % i == 0:
           if n / i == i:
               num_divizori += 1
           else:
               num_divizori += 2
   return num_divizori

def rezolva_problema(input_file, output_file, c):

   # Deschidem fișierul de intrare și citim datele
   with open(input_file, 'r') as fisier:
       n, c = map(int, fisier.readline().split())  # Citim n și c
       sir = [int(numar) for numar in fisier.readline().split()]  # Citim șirul de numere
       p = int(fisier.readline())  # Citim p
   # Deschidem fișierul de ieșire pentru a scrie rezultatul
   with open(output_file, 'w') as fisier:
       if c == 1:
           # Afișăm numărul de divizori ai numărului de pe poziția p
           fisier.write(str(numar_divizori(sir[p-1])))
       else:
           # Afișăm numerele din șir care au același număr de divizori ca numărul de pe poziția p
           num_divizori_p = numar_divizori(sir[p-1])
           numere = sorted((numar for numar in sir if numar_divizori(numar) == num_divizori_p), reverse=True)
           fisier.write(' '.join(str(numar) for numar in numere))

if __name__ == "__main__":

   rezolva_problema('divizori4.in', 'divizori4.out', 1)
   rezolva_problema('divizori4.in', 'divizori4.out', 2)

</syntaxhighlight>