3073 - Repartitie

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.

Enunț

Într-o școală sunt nr_clase_7 clase a VII-a, fiecare de câte elevi_clasa_7 elevi, și nr_clase_8 clase a VIII-a, fiecare de câte elevi_clasa_8 elevi. Directorul școlii vrea să facă o nouă repartizare a elevilor în clase astfel încât în fiecare clasă: a) să fie același număr de elevi; b) să fie doar elevi de clasa a VII-a sau doar elevi de clasa a VIII-a.

Cerinţa

Cunoscându-se valorile nr_clase_7, elevi_clasa_7, nr_clase_8 și elevi_clasa_8, numere naturale nenule, scrieți un program pentru a determina nr_clase_necesare numărul de clase necesar acestei noi repartizări, noul număr nr_clase_repartizate_7 de clase a VII-a, respectiv nr_clase_repartizate_8 de clase a VIII-a, precum și numărul nr_elevi_repartizati maxim de elevi repartizați într-o clasă.

Date de intrare

Programul citește de la tastatură numerele naturale nr_clase_7, elevi_clasa_7, nr_clase_8 și elevi_clasa_8, separate prin spații.

Date de ieşire

Programul va afișa pe ecran numerele naturale: nr_clase_necesare, nr_clase_repartizate_7, nr_clase_repartizate_8, nr_elevi_repartizati, separate prin câte un spațiu.

Restricții și precizări

  • nr_clase_7, elevi_clasa_7, nr_clase_8 și elevi_clasa_8 ∈ Ν
  • 1 ⩽ nr_clase_7, elevi_clasa_7, nr_clase_8, elevi_clasa_8, nr_clase_necesare, nr_clase_repartizate_7, nr_clase_repartizate_8, nr_elevi_repartizati ⩽ 1.000.000.000

Exemplu1

Intrare
4 30 5 27
Ieșire
Datele de intrare corespund restricțiilor impuse.
17 8 9 15

Explicație

Pentru nr_clase_7=4, elevi_clasa_7=30, nr_clase_8=5, elevi_clasa_8=27, numărul de clase necesar acestei noi repartizări este nr_clase_necesare=17, dintre care vor fi nr_clase_repartizate_7=8 clase a VII-a și nr_clase_repartizate_8=9 clase a VIII-a, iar în fiecare clasă vor fi repartizați maxim nr_elevi_repartizati=15 elevi.

Rezolvare

def validare_date(nr_clase_7, elevi_clasa_7, nr_clase_8, elevi_clasa_8):
    if 0 <= int(nr_clase_7) <= 1_000_000 and 0 <= int(elevi_clasa_7) <= 1_000_000 \
            and 0 <= int(nr_clase_8) <= 1_000_000 and 0 <= int(elevi_clasa_8) <= 1_000_000:
        return True
    return False


def cmmdc(nr_elevi_7, nr_elevi_8):
    while nr_elevi_8:
        r = nr_elevi_7 % nr_elevi_8
        nr_elevi_7 = nr_elevi_8
        nr_elevi_8 = r
    return nr_elevi_7


def calculare_repartizare(nr_clase_7, elevi_clasa_7, nr_clase_8, elevi_clasa_8):
    nr_elevi_7 = nr_clase_7 * elevi_clasa_7
    nr_elevi_8 = nr_clase_8 * elevi_clasa_8
    nr_elevi_repartizati = cmmdc(nr_elevi_7, nr_elevi_8)
    nr_clase_repartizate_7 = nr_elevi_7 // nr_elevi_repartizati
    nr_clase_repartizate_8 = nr_elevi_8 // nr_elevi_repartizati
    nr_clase_necesare = nr_clase_repartizate_7 + nr_clase_repartizate_8
    print(nr_clase_necesare, nr_clase_repartizate_7, nr_clase_repartizate_8, nr_elevi_repartizati)


if __name__ == '__main__':
    nr_clase_7, elevi_clasa_7, nr_clase_8, elevi_clasa_8 = map(int, input().split())
    if validare_date(nr_clase_7, elevi_clasa_7, nr_clase_8, elevi_clasa_8):
        print("\nDatele de intrare corespund restrictiilor impuse.\n")
        calculare_repartizare(nr_clase_7, elevi_clasa_7, nr_clase_8, elevi_clasa_8)
    else:
        print("Datele de intrare nu corespund restrictiilor impuse.")

Explicație

Programul citește de la tastatură numărul de clase și numărul de elevi pe clasă pentru două niveluri de învățământ (clasele a 7-a și a 8-a) și calculează numărul total de clase necesare pentru a repartiza toți elevii în grupuri de același număr. Înainte de a face calculele, se verifică dacă valorile introduse sunt cuprinse între 0 și 1.000.000. Funcția cmmdc este utilizată pentru a calcula cel mai mare divizor comun al numărului de elevi din cele două niveluri. Se calculează, de asemenea, numărul de clase necesare pentru nivelul 7 și nivelul 8, precum și numărul total de clase necesare. Rezultatele sunt afișate într-un format specific.