1550 - DivFactorial

De la Universitas MediaWiki

Sursa: 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 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

  • 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

Exemplul 1

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

Explicație exemplul 1

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

Exemplul 2

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


Rezolvare

# 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)

Explicație rezolvare

   Î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.