0112 - Fractie Minima

From Bitnami MediaWiki
Revision as of 14:40, 29 March 2023 by Robert Manc (talk | contribs) (Pagină nouă: == Cerinţa == Să se scrie un program care citește un șir de '''n''' numere naturale şi determină cea mai mică fracţie care poate fi scrisă cu numărătorul şi numitorul dintre cele '''n''' numere. == Date de intrare == Programul citește de la tastatură numărul '''n''', iar apoi '''n''' numere naturale nenule, separate prin spaţii. == Date de ieşire == Programul afișează pe ecran numărul fracţia cerută, în forma '''fractie'''. == Restricții și precizări...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerinţa

Să se scrie un program care citește un șir de n numere naturale şi determină cea mai mică fracţie care poate fi scrisă cu numărătorul şi numitorul dintre cele n numere.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale nenule, separate prin spaţii.

Date de ieşire

Programul afișează pe ecran numărul fracţia cerută, în forma fractie.

Restricții și precizări

  • n ∈ Ν
  • 0 < n < 1.001
  • cele n numere citite vor fi mai mici decât 2.000.000.000
  • fracţia afişată va fi ireductibilă

Exemplu1

Intrare
5
6 10 3 2 5
Ieșire
Datele introduse corespund restricțiilor impuse.
1/5

Explicație

Cea mai mică fracţie care se poate scrie cu numerele din şire este 2/10. Prin simplificare se obţine fracţia ireductibilă 1/5.

Exemplu2

Intrare
4
5 9 2 14
Ieșire
Datele introduse corespund restricțiilor impuse.
1/7

Explicație

Cea mai mică fracţie care se poate scrie cu numerele din şire este 2/14. Prin simplificare se obţine fracţia ireductibilă 1/7.

Rezolvare

<syntaxhighlight lang="python" line> def validare_date(numar, numere):

   flag = False
   if 0 < int(numar) < 1001:
       flag = all(isinstance(x, int) and 1 <= x <= 2_000_000_000 for x in numere)
   return flag


def gcd(a, b):

   while b:
       a, b = b, a % b
   return a


def fractie_minima(numere):

   max_numar = -1
   min_numar = float('inf')
   for numar in numere:
       if numar < min_numar:
           min_numar = numar
       if numar > max_numar:
           max_numar = numar
   div = gcd(max_numar, min_numar)
   x = min_numar // div
   y = max_numar // div
   m = gcd(x, y)
   return str(x // m) + '/' + str(y // m)


if __name__ == '__main__':

   n = int(input())
   numere = list(map(int, input().split()))
   if validare_date(n, numere):
       print("\nDatele de intrare corespund restricțiilor impuse.\n")
       fractie = fractie_minima(numere)
       print(fractie)
   else:
       print("Datele de intrare nu corespund restricțiilor impuse.")

</syntaxhighlight>