2745 - Intrebari

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

Se dau nr_elemente numere naturale. Dându-se totodată un număr p, apare o intrebare care poate fi de unul dintre următoarele două feluri posibile: care este suma cifrelor valorii minime dintre primele p ale șirului (tipul 1) respectiv, care este numărul de divizori ai valorii maxime dintre primele p elemente ale șirului (tipul 2).

Date de intrare

Programul citește de la tastatură mai întâi numerele nr_elemente, tip_cerinta și p iar apoi sir numere naturale (elementele șirului).

Date de ieşire

Dacă valoarea tip_cerinta, este 1, programul va afișa pe ecran răspunsul la cerința de tipul 1. Dacă valoarea tip_cerinta, este 2, programul va afișa pe ecran răspunsul la cerința de tipul 2.

Indiferent de tipul cerinței, pe linia următoare se va afișa suma elementelor șirului.

Restricții și precizări

  • nr_elemente ∈ Ν
  • 0 ⩽ nr_elemente ⩽ 10
  • cele sir numere citite vor fi naturale nenule și mai mici decât 1.000.000.000
  • numerele șirului sunt numerotate începând cu 1
  • valoarea lui p este cuprinsă între 1 și n, inclusiv
  • 1 ⩽ tip_cerinta ⩽ 2

Exemplu1

Intrare
6 1 3
14 13 16 22 15 1
Ieșire
Datele introduse corespund restricțiilor impuse.
4
81

Explicație

Este vorba despre o interogare de tipul 1 și minimul dintre primele trei elemente ale șirului este 13 iar suma cifrelor sale este 4.

Exemplu2

Intrare
6 2 3
14 13 16 22 15 1
Ieșire
Datele introduse corespund restricțiilor impuse.
5
81

Explicație

Este vorba despre o interogare de tipul 2 și maximul dintre primele trei elemente ale șirului este 16 iar numărul său de divizori este 5.

Rezolvare

import math


def validare_date(nr_elemente, tip_cerinta, p, sir):
    flag = False
    if 0 <= int(nr_elemente) <= 10 and 1 <= int(tip_cerinta) <= 2 and 1 <= int(p) <= nr_elemente:
        flag = all(isinstance(x, int) and 1 <= x <= 1_000_000_000 for x in sir)
    return flag


def nr_divizori(n):  #Calculează numărul de divizori ai lui "n" folosind o buclă "for" și o serie de expresii condiționale.
    cnt = 0
    for i in range(1, int(math.sqrt(n))+1):
        if n % i == 0:
            cnt += 2
        if i * i == n:
            cnt -= 1
    print(cnt)


def suma_cifre(min_val):  #Calculează suma cifrelor lui "min_val" folosind o buclă "for"
    suma = 0
    for i in str(min_val):
        suma = suma + min_val % 10
        min_val = min_val // 10
    print(suma)


if __name__ == '__main__':
    nr_elemente, tip_cerinta, p = map(int, input().split())
    sir = list(map(int, input().split()))
    suma = sum(sir)
    min_val = min(sir[:p])
    max_val = max(sir[:p])
    if validare_date(nr_elemente, tip_cerinta, p, sir):
        print("\nDatele de intrare corespund restricțiilor impuse.\n")
        if tip_cerinta == 1:
            suma_cifre(min_val)
            print(suma)
        else:
            nr_divizori(max_val)
            print(suma)
    else:
        print("Datele de intrare nu corespund restricțiilor impuse.")

Explicație

Acest cod definește trei funcții:

"validare_date" - care primește patru argumente și verifică dacă acestea respectă anumite restricții de valori și tipuri, returnând un flag boolean.
"nr_divizori" - care primește un număr întreg "n" și calculează numărul său de divizori, afișând rezultatul.
"suma_cifre" - care primește un număr întreg "min_val" și calculează suma cifrelor sale.

În funcția principală "main", utilizatorul este invitat să introducă trei numere întregi separate prin spațiu: "nr_elemente", "tip_cerinta" și "p", urmate de "nr_elemente" numere întregi separate prin spațiu și reprezentând elementele unei liste "sir".

Înainte de a apela funcțiile "nr_divizori" și "suma_cifre", se verifică dacă datele de intrare sunt valide folosind funcția "validare_date". Dacă datele de intrare sunt valide, se calculează și se afișează rezultatele în funcție de tipul cerinței ("tip_cerinta"). În caz contrar, se afișează un mesaj de eroare.