3355 - Caramele: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 12 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 7: Linia 7:


== Date de ieșire ==  
== Date de ieșire ==  
Dacă datele introduse sunt corecte și respectă formatul așteptat, programul va afișa un mesaj pe ecran cu textul "Datele sunt introduse corect.", iar apoi va afișa în continuare, pe un rând nou, elementele vectorului y, separate prin exact un spațiu.
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."


În cazul în care datele din fișierul de intrare nu respectă restricțiile impuse (de exemplu, nu este un număr întreg), programul va afișa pe ecran mesajul "Datele nu corespund restricțiilor impuse." și nu va continua cu restul execuției programului.
== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 1 ⩽ '''n''' ⩽ 1000
* 1 ⩽ '''n''' ⩽ 1000
Linia 16: Linia 17:
== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; 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
: 4
; Ieșire
: Datele corespund cerințelor.
: 576
<br>
<br>


== Exemplul 2 ==
== Exemplul 2 ==
; Intrare
; Intrare
: 16
: Introduceti numarul de numere: 10001
; Ieșire
: Datele introduse nu corespund cerințelor.
<br>
== Exemplul 3 ==
; Intrare
: 7
; Ieșire
; Ieșire
: Datele corespund cerințelor.
: Datele introduse nu corespund cerintelor.
: 25401600
<br>
<br>


Linia 56: Linia 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
Linia 82: Linia 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>
== Explicatie rezolvare ==
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'''.

Versiunea curentă din 29 aprilie 2023 18:02

Sursa: [1]

Cerinţa

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

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

Date de ieșire

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

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

Exemplul 1

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

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


Rezolvare

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

Explicatie rezolvare

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.