2117 - Divizori 2
Cerinţa
Marinel a învăţat la şcoală despre divizibilitatea numerelor naturale. Un număr natural nenul a este divizor al numărului natural nenul b dacă restul împărţirii lui b la a este 0. De exemplu, numărul 3 este divizor al lui 12 iar numărul 4 nu este divizor al lui 15. Un număr natural nenul n este număr prim dacă are doar 2 divizori: 1 şi n. De exemplu, numărul 7 este număr prim deoarece îi are ca divizori doar pe 1 şi 7 iar numărul 21 nu este număr prim deoarece îi are ca divizori pe 1, 3, 7 şi 21. Scrieţi un program care să îl ajute pe Marinel să îşi verifice tema primită pentru acasă.
Fiind date numărul n al numerelor din şir şi numerele din şir, să se determine: 1) divizorii celui mai mare număr din şir, inclusiv 1 şi el însuşi; 2) numerele prime din şir; 3) numerele care sunt divizori ai tuturor numerelor din şir.
Date de intrare
Fişierul de intrare divizori2.in conține pe prima linie un număr natural P, pe a doua linie un număr natural n reprezentând numărul de numere din şir şi pe a treia linie cele n numere naturale din şir, separate prin spaţii.
Date de ieșire
Dacă valoarea lui P este 1, se va rezolva numai punctul 1) din cerinţă: fişierul divizori2.out va conţine pe prima linie doar divizorii celui mai mare număr din şir. Dacă valoarea lui P este 2, se va rezolva doar punctul 2) din cerinţă: fişierul divizori2.out va conţine pe prima linie doar numerele prime din şir sau numărul -1 dacă şirul nu conţine numere prime. Dacă valoarea lui P este 3, se va rezolva numai punctul 3) din cerinţă: fişierul divizori2.out va conţine pe prima linie doar numerele care sunt divizori ai tuturor numerelor din şir.
Restricţii şi precizări
- valoarea lui P poate să fie doar 1 sau 2 sau 3;
- numărul natural n este cuprins între 2 şi 1000;
- numerele din şir sunt numere naturale nenule cu cel mult 6 cifre;
- pentru rezolvarea corectă a primei cerinţe se acordă 30 de puncte;
- pentru rezolvarea corectă a celei de-a doua cerinţe se acordă 30 de puncte;
- pentru rezolvarea corectă a celei de-a treia cerinţe se acordă 40 de puncte;
Exemplu
- divizori2.in
- 1
- 7
- 12 18 8 4 13 6 17
- divizori2.out
- 1 2 3 6 9 18
Exemplu 2
- divizori2.in
- 2
- 7
- 12 18 8 4 13 6 17
- divizori2.out
- 13 17
Rezolvare
<syntaxhighlight lang="python" line> with open('divizori2.in', 'r') as fin:
p = int(fin.readline()) n = int(fin.readline()) numbers = list(map(int, fin.readline().split()))
- Deschidem fișierul de ieșire
with open('divizori2.out', 'w') as fout:
if p == 1: # Căutăm cel mai mare număr din șir max_number = max(numbers) # Scriem divizorii acestuia în fișierul de ieșire fout.write(' '.join(str(i) for i in range(1, max_number + 1) if max_number % i == 0) + '\n') elif p == 2: # Scriem numerele prime din șir în fișierul de ieșire fout.write(' '.join(str(num) for num in numbers if all(num % i != 0 for i in range(2, int(num ** 0.5) + 1))) or '-1') elif p == 3: # Scriem numerele care sunt divizori ai tuturor numerelor din șir în fișierul de ieșire fout.write(' '.join(str(i) for i in range(1, min(numbers) + 1) if all(num % i == 0 for num in numbers)))
</syntaxhighlight>
Explicatie
- P=1 deci se rezolvă prima cerinţă.
- Cel mai mare număr din şir este 18
- Divizorii numărului 18 sunt 1, 2, 3, 6, 9 şi 18