2104 - Factorial 3: Difference between revisions
No edit summary |
No edit summary |
||
(3 intermediate revisions by the same user not shown) | |||
Line 21: | Line 21: | ||
:5 | :5 | ||
;Ieșire | ;Ieșire | ||
:Datele de intrare corespund restricțiilor impuse. | |||
:5 | :5 | ||
Line 30: | Line 31: | ||
:1 | :1 | ||
;Ieșire | ;Ieșire | ||
: | :Datele de intrare nu corespund restricțiilor impuse. | ||
==Rezolvare== | ==Rezolvare== | ||
<syntaxhighlight lang="python" line="1"> | <syntaxhighlight lang="python" line="1"> | ||
#2104 Factorial3 | #2104 Factorial3 | ||
def conditii(n): | |||
return 2 <= n <= 100_000 | |||
Line 41: | Line 43: | ||
factori = [] | factori = [] | ||
# Dacă n este par, îl împărțim la 2 până nu mai este par și adăugăm 2 la lista de factori primi | |||
while n % 2 == 0: | while n % 2 == 0: | ||
n = | n //= 2 | ||
factori.append(2) | factori.append(2) | ||
# Check odd numbers as potential factors starting from 3 up to sqrt(n) | |||
# Verificăm numere impare începând cu 3 până la rădăcina pătrată a lui n | |||
i = 3 | |||
while i*i <= n: | |||
# Dacă i este factor prim, îl adăugăm la lista de factori primi | |||
if n % i == 0: | |||
n //= i | |||
factori.append(i) | factori.append(i) | ||
# Dacă nu, trecem la următorul număr impar (3+2=5, 5+2=7, 7+2=9, 9+2=11 ...) | |||
else: | |||
i += 2 | |||
if n > 2: | if n > 2: | ||
factori.append(n) | factori.append(n) | ||
Line 55: | Line 66: | ||
def | def factorial3(n): | ||
factori = [] | factori = [] | ||
# Pentru fiecare număr de la 2 la n+1, adăugăm factorii primi ai săi la lista de factori | |||
# extend() este o funcție built-in care adaugă elementele unui iterable la un alt iterable | |||
for i in range(2, n+1): | for i in range(2, n+1): | ||
factori.extend(factori_primi(i)) | factori.extend(factori_primi(i)) | ||
# Creăm un dicționar care are ca chei factorii primi și ca valori numărul de apariții ale fiecărui factor prim | |||
factor_prim_nr = {} | factor_prim_nr = {} | ||
# Pentru fiecare factor prim din lista de factori... | |||
for factor in factori: | for factor in factori: | ||
# ...îl adăugăm în dicționar și incrementăm numărul de apariții | |||
# get() este o funcție built-in care returnează valoarea asociată unei chei dintr-un dicționar, | |||
# iar dacă cheia nu există, returnează valoarea default (în cazul nostru 0) | |||
factor_prim_nr[factor] = factor_prim_nr.get(factor, 0) + 1 | factor_prim_nr[factor] = factor_prim_nr.get(factor, 0) + 1 | ||
print(sum(factor_prim_nr.values())) | |||
if __name__ == "__main__": | |||
n = int(input()) | n = int(input()) | ||
if not conditii(n): | if not conditii(n): | ||
print("Datele de intrare nu corespund restricțiilor impuse.") | |||
print("Datele de intrare corespund restricțiilor impuse.") | else: | ||
print("Datele de intrare corespund restricțiilor impuse.") | |||
factorial3(n) | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 13:39, 6 May 2023
Cerința[edit | edit source]
Factorialul unui număr natural nenul n
, notat n!
, se defineşte ca fiind produsul numerelor naturale de la 1
la n
. Una dintre modalităţile de reprezentare a factorialului este prin enumerarea factorilor primi pe care îi conţine şi a exponenţilor acestora.
Fiind dat un număr natural n
, scrieţi un program care determină suma exponenţilor factorilor primi corespunzători descompunerii în factori primi a lui n
factorial.
Date de intrare[edit | edit source]
Fişierul de intrare factorial3.in
conţine pe prima linie numărul natural n
.
Date de ieșire[edit | edit source]
Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."
Pe următorul rând se va afișa un număr reprezentând suma exponenţilor numerelor prime din descompunerea în factori primi a lui n!
.
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."
Restricții și precizări[edit | edit source]
2 ≤ n ≤ 100.000
Exemplu 1[edit | edit source]
- Intrare
- 5
- Ieșire
- Datele de intrare corespund restricțiilor impuse.
- 5
Explicație[edit | edit source]
5! = 1*2*3*4*5 = 23*31*51
3+1+1=5
Exemplu 2[edit | edit source]
- Intrare
- 1
- Ieșire
- Datele de intrare nu corespund restricțiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 2104 Factorial3
def conditii(n):
return 2 <= n <= 100_000
def factori_primi(n):
factori = []
# Dacă n este par, îl împărțim la 2 până nu mai este par și adăugăm 2 la lista de factori primi while n % 2 == 0: n //= 2 factori.append(2)
# Check odd numbers as potential factors starting from 3 up to sqrt(n) # Verificăm numere impare începând cu 3 până la rădăcina pătrată a lui n i = 3 while i*i <= n: # Dacă i este factor prim, îl adăugăm la lista de factori primi if n % i == 0: n //= i factori.append(i) # Dacă nu, trecem la următorul număr impar (3+2=5, 5+2=7, 7+2=9, 9+2=11 ...) else: i += 2
if n > 2: factori.append(n)
return factori
def factorial3(n):
factori = [] # Pentru fiecare număr de la 2 la n+1, adăugăm factorii primi ai săi la lista de factori # extend() este o funcție built-in care adaugă elementele unui iterable la un alt iterable for i in range(2, n+1): factori.extend(factori_primi(i)) # Creăm un dicționar care are ca chei factorii primi și ca valori numărul de apariții ale fiecărui factor prim factor_prim_nr = {} # Pentru fiecare factor prim din lista de factori... for factor in factori: # ...îl adăugăm în dicționar și incrementăm numărul de apariții # get() este o funcție built-in care returnează valoarea asociată unei chei dintr-un dicționar, # iar dacă cheia nu există, returnează valoarea default (în cazul nostru 0) factor_prim_nr[factor] = factor_prim_nr.get(factor, 0) + 1
print(sum(factor_prim_nr.values()))
if __name__ == "__main__":
n = int(input()) if not conditii(n): print("Datele de intrare nu corespund restricțiilor impuse.") else: print("Datele de intrare corespund restricțiilor impuse.") factorial3(n)
</syntaxhighlight>