0381 - A Prim 2

De la Universitas MediaWiki
Versiunea din 24 martie 2023 17:57, autor: Paul Matei (discuție | contribuții) (Pagină nouă: == Cerinţa == Se citește un număr natural '''n''' și apoi '''n''' numere naturale. Să se determine cel mai mare număr aproape prim dintre cele date, și de câte ori apare. == Date de intrare == Programul citește de la tastatură numărul '''n''', și apoi '''n''' numere naturale. == Date de ieşire == Programul afișează pe ecran numere '''M''' și '''C''', separate prin exact un spațiu, reprezentând cel mai mare număr aproape prim dintre cele date și numărul s...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Cerinţa

Se citește un număr natural n și apoi n numere naturale. Să se determine cel mai mare număr aproape prim dintre cele date, și de câte ori apare.

Date de intrare

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

Date de ieşire

Programul afișează pe ecran numere M și C, separate prin exact un spațiu, reprezentând cel mai mare număr aproape prim dintre cele date și numărul său de apariții.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • cele n numere citite sunt cuprinse între 1 și 1.000.000.000

Exemplu

Intrare
6

35 55 12 6 25 50

Ieșire
55 1


Rezolvare

def validare_date(numar1, numar2):
    flag = False

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

def is_almost_prime(n):
    prime_factors = []
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            if is_prime(i):
                prime_factors.append(i)
            if is_prime(n//i):
                prime_factors.append(n//i)
    if len(prime_factors) == 2 or (len(prime_factors) == 1 and prime_factors[0]**2 == n):
        return True
    if len(prime_factors) == 0:
        return False
    if len(prime_factors) > 2:
        return False
    if abs(prime_factors[0]*prime_factors[1] - n) <= 1:
        return True
    return False

n = int(input("Introduceti numarul de numere: "))

validare_date(n, 1_000_000_000)  # Validare date

max_almost_prime = -1
count = 0

for i in range(n):
    num = int(input("Introduceti numarul: "))
    if is_almost_prime(num) and num > max_almost_prime:
        max_almost_prime = num
        count = 1
    elif num == max_almost_prime:
        count += 1

print("Cel mai mare numar aproape prim este", max_almost_prime, "si apare de", count, "ori.")