1437 - Fractii 4: Difference between revisions
Diana Butuza (talk | contribs) |
Diana Butuza (talk | contribs) |
||
Line 25: | Line 25: | ||
: 12 6 | : 12 6 | ||
; fractii4.out | ; fractii4.out | ||
: Datele sunt introduse corect. | : Datele de intrare sunt introduse corect. | ||
: 2 | : 2 | ||
: -1 | : -1 |
Revision as of 10:06, 25 April 2023
Enunţ
Se dă un șir de n fracții. Fiecare fracție este dată printr-o pereche de numere reprezentând numărătorul și numitorul fracției. De exemplu 2010 34 reprezintă fracția 2010/34. O fracție poate fi ireductibilă sau se poate simplifica. În exemplul precedent, 2010/34 se simplifică prin 2 și rezultă 1005/17.
Cerinţa
Să se afișeze, pentru fiecare fracție:
1) Prin câte moduri distincte se poate simplifica. 2) Fracția ireductibilă.
Date de intrare
În fișierul de intrare fractii4.in pe prima linie se găsesc numerele P și n, iar pe următoarele n linii se găsesc n perechi de numere, reprezentând numărătorul și numitorul fiecărei fracții, separate printr-un spațiu.
Date de iesire
Dacă datele sunt introduse corect, în fișier se va afișa: "Datele de intrare sunt introduse corect.", apoi pe fiecare din cele n linii ale fișierului fractii4.out se găsesc, pentru fiecare fracție, în ordinea dată în fișierul de intrare: 1) Dacă P = 1, numărul de simplificări distincte posibile. Dacă nu este posibilă nicio simplificare (fracția este ireductibilă) se va afișa -1. 2) Dacă P = 2 , fracția ireductibilă, numărătorul și numitorul fiind separați prin /. În cazul în care datele nu respectă restricțiile, se va afișa în fișier: "Datele nu corespund restricțiilor impuse.".
Restricții și precizări
- n ⩽ 100 000
- 0 < numitor, numărător < 2 000 000
- P este 1 sau 2
Exemplul 1
- fractii4.in
- 11 4
- 8 4
- 3 2
- 1 6
- 12 6
- fractii4.out
- Datele de intrare sunt introduse corect.
- 2
- -1
- -1
- 3
Explicație
Pentru acest test 'P = 1, deci se va rezolva doar cerinţa 1). Prima fracție se poate simplifica prin 2 moduri: prin 2 și 4. A doua este ireductibilă, deci se va afișa -1. A treia este ireductibilă, deci se va afișa -1. A patra se poate simplifica prin 3 moduri: 2, 3 și 6.
Exemplul 2
- fractii4.in
- 12 3
- 22 6
- 11 4
- 125 25
- fractii4.out
- Datele de intrare sunt introduse corect.
- 11/3
- 11/4
- 5/1
Explicație
Pentru acest test P = 2, deci se va rezolva doar cerinţa 2). Prima fracție se simplifică prin 2. A doua fracție este ireductibilă, deci va fi afișată fără schimbare. Ultima fracție poate fi redusă prin 25 și devine ireductibilă. Chiar dacă numitorul este 1, acesta va fi afișat.
Rezolvare
<syntaxhighlight lang="python" line> import math
def prim(n):
if n == 0 or n == 1: return 0 if n == 2: return 1 if n % 2 == 0: return 0 else: for i in range(3, int(math.sqrt(n))+1, 2): if n % i == 0: return 0 return 1
def prime(a, b):
if b == 0: return a else: return prime(b, a % b)
def validare_date(n, p):
if n <= 100000 and p in [1, 2]: return True else: return False
if __name__ == '__main__':
fin = open("fractii4.in", "r") fout = open("fractii4.out", "w") p, n = map(int, fin.readline().split()) if validare_date(n, p): print("\nDatele de intrare sunt introduse corect.\n") for i in range(n): a, b = map(int, fin.readline().split()) x, y = a, b if p == 1: if prim(a) == 0 and prim(b) == 0 and prime(a, b) == 1: d = 0 d1 = prime(a, b) for j in range(1, int(math.sqrt(d1))+1): if d1 % j == 0: d += 2 if j * j == d1: d -= 1 fout.write(str(d-1) + '\n') else: fout.write("-1\n") else: t = prime(a, b) fout.write(str(x//t) + '/' + str(y//t) + '\n') fin.close() fout.close() else: print("Datele de intrare nu corespund restrictiilor impuse.")
</syntaxhighlight>