1316 - Prim Aproape Prim - Patrat Prim - Compus

De la Universitas MediaWiki

Cerinţa

  • Un număr natural nenul este prim, dacă are exact doi divizori (ex. 7).
  • Un număr natural nenul se va numi pătrat prim, dacă este pătratul unui număr prim (ex. 49 = 7 * 7).
  • Un număr natural nenul se va numi aproape prim, dacă este produsul a două numere prime distincte (ex. 10 = 2 * 5).
  • Un număr natural nenul ce nu se încadrează în niciuna din cazurile de mai sus, se numeşte compus (ex. 8=2*2*2, 100=2*2*5*5).

Se citeşte un număr natural n. Să se identifice din ce categorie de mai sus face parte.

Date de intrare

Programul citește de la tastatură numărul n.

Date de ieşire

Programul va afișa pe ecran unul dintre mesajele: prim, aproape prim, patrat prim sau compus.

Restricții și precizări

  • 1 < n ≤ 2.000.000.000

Exemplu

Intrare
20
Ieșire
compus

Explicație

Numărul 20=2*2*5, deci este număr compus.

Rezolvare

import math

def prim(n):
    cnt = 0
    for i in range(1, int(math.sqrt(n))+1):
        if n % i == 0:
            cnt += 2
        if i * i == n:
            cnt -= 1
    if cnt == 2:
        return 1
    elif cnt == 4:
        return 2
    else:
        return 0

def validare_date(prompt):
    while True:
        try:
            value = int(input(prompt))
            if value <= 0:
                print("Introduceti un numar intreg pozitiv.")
            else:
                return value
        except ValueError:
            print("Introduceti un numar intreg pozitiv.")

if __name__ == '__main__':
    n = validare_date("Introduceti un numar intreg pozitiv: ")
    i = int(math.sqrt(n))
    if prim(n) == 1:
        print("prim")
    elif prim(n) == 2:
        print("aproape prim")
    elif i * i == n and prim(i) == 1:
        print("patrat prim")
    else:
        print("compus")
    print("Datele de intrare corespund restrictiilor impuse.")

Explicație rezolvare

Acest program determină dacă un număr dat este prim, aproape prim sau compus.

Pentru a verifica dacă numărul este prim, se apelează funcția prim(n), care primește ca argument numărul dat n. În interiorul funcției, se calculează numărul de divizori ai lui n prin parcurgerea tuturor numerelor întregi până la radicalul pătrat al lui n. Dacă numărul de divizori ai lui n este 2, atunci n este un număr prim.

Dacă numărul de divizori ai lui n este 4, atunci n este considerat aproape prim.

Dacă n este un pătrat perfect și radicalul pătrat al lui n este prim, atunci n este considerat patrat prim.

Dacă niciuna dintre condițiile de mai sus nu este îndeplinită, atunci n este considerat un număr compus.

Funcția validare_date(prompt) este folosită pentru a valida input-ul primit de la utilizator. Această funcție cere introducerea unui număr întreg pozitiv și afișează un mesaj de eroare dacă input-ul nu este un număr întreg pozitiv.

În cadrul programului principal, se citește input-ul utilizatorului folosind funcția validare_date(prompt) și se determină tipul de număr folosind funcția prim(n). Programul afișează apoi tipul numărului și un mesaj care confirmă faptul că input-ul corespunde restricțiilor impuse.