3355 - Caramele: Difference between revisions

From Bitnami MediaWiki
Dragos1234 (talk | contribs)
Dragos1234 (talk | contribs)
 
(6 intermediate revisions by 2 users not shown)
Line 9: Line 9:
Acest program primește ca input un număr '''n''' și o listă de '''n''' numere. Scopul său este de a găsi cel mai mic număr din listă care are exact un factor prim.
Acest program primește ca input un număr '''n''' și o listă de '''n''' numere. Scopul său este de a găsi cel mai mic număr din listă care are exact un factor prim.


Dacă numărul are exact un factor prim și este mai mic decât cel mai mic număr găsit până acum, acesta este actualizat ca fiind cel mai mic număr. Dacă nu se găsește niciun număr cu exact un factor prim, programul afișează '''NU EXISTA'''.
Dacă numărul are exact un factor prim și este mai mic decât cel mai mic număr găsit până acum, acesta este actualizat ca fiind cel mai mic număr, iar în consolă va fi afișat mesajul "Datele introduse corespund cerintelor." Dacă nu se găsește niciun număr cu exact un factor prim, programul afișează '''NU EXISTA''', iar în cazul în care datele sunt introduse greșit programul va afișa "Datele introduse nu corespund cerintelor."


== Restricţii şi precizări ==
== Restricţii şi precizări ==
Line 24: Line 24:
: Introduceti numar: 20
: Introduceti numar: 20
; Ieșire
; Ieșire
: Cel mai mic numar cu exact un factor prim este: 4
: Datele introduse corespund cerintelor
: 4
<br>
<br>


Line 31: Line 32:
: Introduceti numarul de numere: 10001
: Introduceti numarul de numere: 10001
; Ieșire
; Ieșire
: Numarul introdus trebuie sa fie intre 1 si 1000!
: Datele introduse nu corespund cerintelor.
<br>
<br>


Line 54: Line 55:




def find_smallest_number_with_one_prime_factor(n):
def find_smallest_number_with_one_prime_factor(n, numbers):
     min_number = float('inf')
     min_number = float('inf')
     for i in range(n):
     for i in range(n):
         x = int(input("Introduceti numar: "))
         x = numbers[i]
         if has_only_one_prime_factor(x) and x < min_number:
         if has_only_one_prime_factor(x) and x < min_number:
             min_number = x
             min_number = x
Line 80: Line 81:


if __name__ == '__main__':
if __name__ == '__main__':
    numbers = []
     n = int(input("Introduceti numarul de numere: "))
     n = int(input("Introduceti numarul de numere: "))
     if not validate_input(n):
     if not validate_input(n):
         print("Numarul introdus trebuie sa fie intre 1 si 1000!")
         print("Datele introduse nu corespund cerintelor.")
     else:
     else:
        numbers = []
         for i in range(n):
         for i in range(n):
             num = int(input("Introduceti numarul {} din lista: ".format(i+1)))
             num = int(input("Introduceti numarul {} din lista: ".format(i+1)))
             numbers.append(num)
             numbers.append(num)
         if not validate_numbers(numbers):
         if not validate_numbers(numbers):
             print("Numerele introduse trebuie sa fie mai mici decat 1.000.000.000!")
             print("Datele introduse nu corespund cerintelor.")
         else:
         else:
             print("Cel mai mic numar cu exact un factor prim este:",  
             print("Datele introduse corespund cerintelor\n",find_smallest_number_with_one_prime_factor(n, numbers))
find_smallest_number_with_one_prime_factor(n))


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 18:02, 29 April 2023

Sursa: [1]

Cerinţa[edit | edit source]

Se dau n numere naturale. Determinați cel mai mic număr care are un singur factor prim. Dacă nu există niciun număr cu un singur factor prim se va afișa mesajul NU EXISTA.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n numere naturale.

Date de ieșire[edit | edit source]

Acest program primește ca input un număr n și o listă de n numere. Scopul său este de a găsi cel mai mic număr din listă care are exact un factor prim.

Dacă numărul are exact un factor prim și este mai mic decât cel mai mic număr găsit până acum, acesta este actualizat ca fiind cel mai mic număr, iar în consolă va fi afișat mesajul "Datele introduse corespund cerintelor." Dacă nu se găsește niciun număr cu exact un factor prim, programul afișează NU EXISTA, iar în cazul în care datele sunt introduse greșit programul va afișa "Datele introduse nu corespund cerintelor."

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

  • 1 ⩽ n ⩽ 1000
  • cele n numere citite vor fi mai mici decât 1.000.000.000.

Exemplul 1[edit | edit source]

Intrare
Introduceti numarul de numere: 5
Introduceti numar: 12
Introduceti numar: 9
Introduceti numar: 16
Introduceti numar: 4
Introduceti numar: 20
Ieșire
Datele introduse corespund cerintelor
4


Exemplul 2[edit | edit source]

Intrare
Introduceti numarul de numere: 10001
Ieșire
Datele introduse nu corespund cerintelor.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 3355

import math

def has_only_one_prime_factor(n):

   d, cnt = 2, 0
   while n > 1:
       p = 0
       while n % d == 0:
           n //= d
           p += 1
       if p:
           cnt += 1
       d += 1
       if d * d > n:
           d = n
   return cnt == 1


def find_smallest_number_with_one_prime_factor(n, numbers):

   min_number = float('inf')
   for i in range(n):
       x = numbers[i]
       if has_only_one_prime_factor(x) and x < min_number:
           min_number = x
   if min_number < float('inf'):
       return min_number
   else:
       return "NU EXISTA"


def validate_input(n):

   if n < 1 or n > 1000:
       return False
   return True


def validate_numbers(numbers):

   for num in numbers:
       if num >= 1000000000:
           return False
   return True


if __name__ == '__main__':

   numbers = []
   n = int(input("Introduceti numarul de numere: "))
   if not validate_input(n):
       print("Datele introduse nu corespund cerintelor.")
   else:
       for i in range(n):
           num = int(input("Introduceti numarul {} din lista: ".format(i+1)))
           numbers.append(num)
       if not validate_numbers(numbers):
           print("Datele introduse nu corespund cerintelor.")
       else:
           print("Datele introduse corespund cerintelor\n",find_smallest_number_with_one_prime_factor(n, numbers))

</syntaxhighlight>

Explicatie rezolvare[edit | edit source]

Acest program determină cel mai mic număr dintre o listă de numere care are un singur factor prim. Programul primește numărul de numere pe care utilizatorul dorește să le introducă, apoi citește aceste numere și verifică dacă fiecare dintre acestea are un singur factor prim. Dacă un număr îndeplinește această condiție și este mai mic decât cel mai mic număr găsit până acum, acesta devine noul cel mai mic număr. Dacă nu există niciun număr cu un singur factor prim, programul returnează NU EXISTA.

Funcția has_only_one_prime_factor(n) este folosită pentru a verifica dacă un număr are un singur factor prim. Aceasta folosește o metodă de divizare repetată, pornind de la 2 și incrementând cu 1 în fiecare iterație. În fiecare iterație, programul împarte numărul la divizorul curent până când nu mai poate fi împărțit, numărând de asemenea de câte ori a putut fi împărțit numărul cu divizorul curent. Dacă numărul a putut fi împărțit cel puțin o dată, se adaugă 1 la numărul de factori primi ai numărului, dacă nu se trece la următorul divizor. Procesul se repetă până când divizorul ridicat la pătrat depășește numărul verificat, caz în care numărul verificat trebuie să fie ultimul factor prim, sau numărul verificat devine 1, caz în care s-a terminat divizarea.

Funcția find_smallest_number_with_one_prime_factor(n) primește un număr n, apoi citește n numere de la tastatură și verifică dacă fiecare dintre acestea are un singur factor prim. Dacă un număr îndeplinește această condiție și este mai mic decât cel mai mic număr găsit până acum, acesta devine noul cel mai mic număr. Funcția returnează cel mai mic număr găsit cu un singur factor prim sau NU EXISTA dacă niciun număr din listă nu îndeplinește această condiție.

Funcțiile validate_input(n) și validate_numbers(numbers) sunt folosite pentru a verifica dacă numărul de numere introdus și numerele introduse îndeplinesc anumite condiții. Funcția validate_input(n) verifică dacă numărul de numere este între 1 și 1000, iar funcția validate_numbers(numbers) verifică dacă toate numerele din listă sunt mai mici decât 1.000.000.000.