1550 - DivFactorial

From Bitnami MediaWiki
Revision as of 13:50, 13 April 2023 by Csatari Mălina (talk | contribs) (Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/1550/divfactorial 1550 - DivFactorial] ---- == Cerinţa == Se da un vector cu '''n''' elemente. Sa se afișeze pe ecran elementele din vector care divid factorialul numărului de elemente '''n'''. == Date de intrare == Programul citește de la tastatură numărul '''n''', iar apoi '''n''' numere naturale, separate prin spații. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: '''"Datele sunt introduse co...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: 1550 - DivFactorial


Cerinţa[edit | edit source]

Se da un vector cu n elemente. Sa se afișeze pe ecran elementele din vector care divid factorialul numărului de elemente n.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou va afișa pe ecran elementele din vector care divid factorialul numărului de elemente n. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ n ⩽ 12
  • cele n numere citite vor fi mai mici decât 1.000.000
  • pentru toate testele va exista cel puțin un element al vectorului care divide n!

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

Intrare
5
16 3 71 30 25
Ieșire
Datele sunt introduse corect.
3 30

Explicație exemplul 1[edit | edit source]

Factorialul numărului de elemente n este 120. Elementele din vector care îl divid pe 120 sunt 3 și 30.

Exemplul 2[edit | edit source]

Intrare
13
1 2 3 4 5 6 7 8 9 10 11 12 13
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1550 DivFactorial

def factorial(n):

   if n == 0 or n == 1:
       return 1
   else:
       return n * factorial(n-1)


def afis_elem_div_cu_n_factorial(vector):

   factorial_n = factorial(n)
   elemente_divizibile = []
   for element in vector:
       if factorial_n % element == 0:
           elemente_divizibile.append(element)
   print(' '.join(map(str, elemente_divizibile)))


def citire_conform_restrictiilor(n, vector):

   if n < 1 or n > 12:
       print("Datele nu corespund restricțiilor impuse.")
       exit()
   for element in vector:
       if element >= 1000000:
           print("Datele nu corespund restricțiilor impuse.")
           exit()
   if n != len(vector):
       print("Datele nu corespund restricțiilor impuse.")
       exit()
   print("Datele sunt introduse corect.")


if __name__ == '__main__':

   n = int(input())
   vector = list(map(int, input().split()))
   citire_conform_restrictiilor(n, vector)
   afis_elem_div_cu_n_factorial(vector)





</syntaxhighlight>

Explicație rezolvare[edit | edit source]

   În blocul if __name__ == '__main__' : se efectuează citirea de la tastatură a valorilor pentru n și vector (liniile 34, 35), apoi se apelează funcția citire_conform_restrictiilor() pentru a verifica conformitatea datelor introduse cu restricțiile impuse. Apoi, se apelează funcția afis_elem_div_cu_n_factorial() pentru a calcula și afișa elementele din vector care divid factorialul numărului n citit.
Funcția factorial(n) primește un argument n și calculează factorialul acestuia folosind o implementare recursivă. Dacă n este 0 sau 1, se returnează 1, altfel se returnează n multiplicat cu factorialul lui n-1. Aceasta este o implementare obișnuită a formulei matematice pentru factorial.
Funcția afis_elem_div_cu_n_factorial(vector) primește ca argument un vector de numere și calculează factorialul numărului n citit anterior (presupus a fi definit global), apoi parcurge vectorul de numere și afișează elementele care divid acest factorial. Elementele care divid factorialul sunt adăugate într-o listă elemente_divizibile utilizând un loop for și operatorul de modulo % pentru a verifica dacă un număr este divizibil cu factorialul calculat. La final, lista de elemente este afișată utilizând funcția print(), metoda join() pentru a le separa prin spații și funcția map() pentru a le converti în string-uri.
Funcția citire_conform_restrictiilor(n, vector) primește ca argumente n și vector și verifică dacă valorile acestora sunt conforme cu restricțiile impuse de problema. Dacă n nu se află în intervalul [1, 12], sau cel puțin un element din vector este mai mare sau egal cu 1.000.000, sau numărul de elemente din vector nu este egal cu n, atunci se afișează "Datele nu corespund restricțiilor impuse.". și se încheie execuția programului utilizând funcția exit(). Altfel, se afișează "Datele sunt introduse corect." și se continuă programul conform main-ului.