2808 - Produs4

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

Subprogramul produs are doi parametri, în această ordine:

  • a, prin care primește un număr natural (a∈[1,106]);
  • k, prin care furnizează cea mai mare valoare naturală impară cu proprietatea că produsul tuturor numerelor impare din intervalul [1,k] este mai mic sau egal cu a.

Scrieți definiția completă a subprogramului în Python.

Date de intrare

Se citesc de la tastatură un număr natural a (a∈[1,106]) și un număr k - cea mai mare valoare naturală impară cu proprietatea că produsul tuturor numerelor impare din intervalul [1,k] este mai mic sau egal cu a.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." Funcția trebuie să returneze un singur număr întreg - valoarea lui k, conform cerinței. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."

Exemplu

Dacă a=200, atunci k=7 (1⋅3⋅5⋅7 ≤ 200 <1⋅3⋅5⋅7⋅9).


Rezolvare

def validate_produs(a, k):
    if not isinstance(a, int) or a < 1 or a > 10**6:
        return False
    if not isinstance(k, int) or k < 1 or k > 10**6 or k % 2 == 0:
        return False
    return True

def produs(a, k):
    i = int(a**0.5) | 1
    p = 1
    while i > 0 and p * i <= a:
        p *= i
        i -= 2
    if p > a:
        return None
    return i + 2

def main():
    a = int(input("Introduceti numarul a: "))
    k = int(input("Introduceti numarul k: "))
    if not validate_produs(a, k):
        print("Date de intrare invalide")
        return
    print("Valoarea maxima pentru k este:", produs(a, k))

Explicație

  • Pe prima linie, calculăm cel mai mare număr impar mai mic sau egal cu radicalul lui a. Folosim operatorul bitwise OR (|) cu 1 pentru a ne asigura că numărul întors este impar.
  • Inițializăm produsul cu 1 și folosim un loop while pentru a verifica dacă produsul tuturor numerelor impare de la 1 la k este mai mic sau egal cu a. Pornim de la i și decrementăm cu 2 la fiecare iterație pentru a număra doar numerele impare. Dacă produsul devine mai mare decât a, ieșim din buclă.
  • Verificăm dacă produsul este mai mare decât a și returnăm None dacă da, altfel returnăm ultimul număr impar găsit (i + 2), deoarece produsul tuturor numerelor impare până la acel număr este mai mic sau egal cu a.