0254 - Puteri

De la Universitas MediaWiki

Cerinţa

Se dau n perechi de numere naturale a, b. Să se determine pentru fiecare pereche, dacă există, cea mai mare putere a lui 2 din intervalul închis determinat de a şi b.

Date de intrare

Programul citeşte de la tastatură numărul n, apoi n perechi de numere a, b.

Date de ieşire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Date de intrare valide.", apoi programul va afişa pe câte o linie ecranului, pentru fiecare interval dat, cea mai mare putere a lui 2 din interval, sau 0, dacă intervalul nu conţine nici o putere al lui 2. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Date de intrare invalide".

Restricţii şi precizări

1 ≤ n ≤ 10000 fiecare dintre numerele a şi b au cel mult 9 cifre. intervalele sunt închise

Exemplu:

Date de intrare

3
2 69
20 10
19 25

Date de ieşire

Date de intrare valide
64
16
0

Rezolvare

def validare(n, a, b):
    for i in range(n):
        if not (1 <= n <= 10_000):
            return False
        if not (0 <= a[i] < 1_000_000_000 and 0 <= b[i] < 1_000_000_000):
            return False
    return True


def puteri(n, a, b):
    for i in range(n):
        p = 1
        while p * 2 <= max(b[i], a[i]):
            p = p * 2
        if p >= min(a[i], b[i]):
            print(p)
        else:
            print(0)


if __name__ == '__main__':
    n = int(input())
    a, b = [], []
    for i in range(n):
        ai, bi = map(int, input().split())
        a.append(ai)
        b.append(bi)

    if validare(n, a, b):
        print("Date de intrare valide")
        puteri(n, a, b)
    else:
        print("Date de intrare invalide")

Explicatie cod:

Funcția validare(n, a, b) primește trei parametri: n de tip întreg, a și b liste de numere întregi. Funcția parcurge fiecare element din listele a și b și verifică dacă n este în intervalul [1, 10000], iar valorile din listele a și b sunt în intervalul [0, 999999999]. Dacă toate aceste condiții sunt îndeplinite pentru fiecare pereche de numere, funcția returnează True, altfel returnează False. Funcția puteri(n, a, b) primește trei parametri: n de tip întreg și a și b liste de numere întregi. Funcția parcurge fiecare element din listele a și b și calculează cea mai mare putere a lui 2 (p) care este mai mică sau egală cu maximul dintre cele două numere. Apoi, verifică dacă p este mai mare sau egal cu minimul dintre cele două numere. În funcție de această verificare, se afișează p sau 0. În blocul if __name__ == '__main__':, se citește n de la intrarea standard și se inițializează listele goale a și b. Se citește perechea de numere ai și bi de n ori și se adaugă valorile în listele corespunzătoare. Se validează datele de intrare utilizând funcția validare(n, a, b). Dacă datele de intrare sunt valide, se afișează un mesaj de confirmare, se apelează funcția puteri(n, a, b) și se afișează rezultatele. Altfel, se afișează un mesaj de eroare. Codul primește datele de intrare de la utilizator, validează datele și efectuează operațiile specifice pentru a determina și afișa rezultatele.