2117 - Divizori 2: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == 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'''...
 
 
(5 intermediate revisions by one other user not shown)
Line 2: Line 2:
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ă.
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:
Fiind date numărul '''n''' al numerelor din şir şi numerele din şir, să se determine:<br>
1) divizorii celui mai mare număr din şir, inclusiv '''1''' şi el însuşi;
1) divizorii celui mai mare număr din şir, inclusiv '''1''' şi el însuşi;<br>
2) numerele prime din şir;
2) numerele prime din şir;<br>
3) numerele care sunt divizori ai tuturor numerelor din şir.
3) numerele care sunt divizori ai tuturor numerelor din şir.
== Date de intrare ==
== 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.
Fişierul de intrare '''divizori2in.txt''' 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 ==
== 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 '''1''', se va rezolva numai punctul 1) din cerinţă: fişierul '''divizori2out.txt''' 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ţă:
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.
fişierul '''divizori2out.txt''' 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ţă:
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.
fişierul '''divizori2out.txt''' va conţine pe prima linie doar numerele care sunt divizori ai tuturor numerelor din şir.
== Restricţii şi precizări ==
== Restricţii şi precizări ==
* valoarea lui '''P''' poate să fie doar '''1''' sau '''2''' sau '''3''';
* valoarea lui '''P''' poate să fie doar '''1''' sau '''2''' sau '''3''';
Line 22: Line 24:
* pentru rezolvarea corectă a celei de-a treia cerinţe se acordă '''40''' de puncte;
* pentru rezolvarea corectă a celei de-a treia cerinţe se acordă '''40''' de puncte;
== Exemplu ==
== Exemplu ==
; divizori2.in
; divizori2in.txt
: 1
1
: 7
7
: 12 18 8 4 13 6 17
12 18 8 4 13 6 17
; divizori2.out
; divizori2out.txt
: 1 2 3 6 9 18
Datele de intrare corespund restrictiilor impuse
1 2 3 6 9 18
 
== Exemplu 2 ==
== Exemplu 2 ==
; divizori2.in
; divizori2in.txt
: 2
2
: 7
7
: 12 18 8 4 13 6 17
12 18 8 4 13 6 17
; divizori2.out
; divizori2out.txt
: 13 17
Datele de intrare corespund restrictiilor impuse
13 17
 
== Exemplu 3 ==
; divizori2in.txt
4
7
12 18 8 4 13 6 17
; divizori2out.txt
Datele de intrare nu corespund restrictiilor impuse
 
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
with open('divizori2.in', 'r') as fin:
def divizori(n):
    p = int(fin.readline())
    div = [1, n]
    n = int(fin.readline())
    for i in range(2, int(n**0.5) + 1):
    numbers = list(map(int, fin.readline().split()))
        if n % i == 0:
            div.append(i)
            if n // i != i:
                div.append(n // i)
    return sorted(div)
 
 
def este_prim(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True
 
 
def validare(p, n, sir):
    if p not in [1, 2, 3]:
        return False, "Datele de intrare nu corespund restrictiilor impuse"
    if not 2 <= n <= 1000:
        return False, "Datele de intrare nu corespund restrictiilor impuse"
    for val in sir:
        if not isinstance(val, int) or not 1 <= val <= 10**6:
            return False, "Datele de intrare nu corespund restrictiilor impuse"
    return True, "Datele de intrare corespund restrictiilor impuse"
 
 
def main():
    with open('divizori2in.txt', 'r') as fin:
        p = int(fin.readline().strip())
        n = int(fin.readline().strip())
        sir = list(map(int, fin.readline().split()))
 
    valid, message = validare(p, n, sir)
    with open('divizori2out.txt', 'w') as fout:
        fout.write(message + '\n')
        if not valid:
            return


# Deschidem fișierul de ieșire
with open('divizori2.out', 'w') as fout:
     if p == 1:
     if p == 1:
         # Căutăm cel mai mare număr din șir
         max_n = max(sir)
        max_number = max(numbers)
         rez = divizori(max_n)
         # 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:
     elif p == 2:
         # Scriem numerele prime din șir în fișierul de ieșire
         rez = [x for x in sir if este_prim(x)]
         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')
         if len(rez) == 0:
    elif p == 3:
            rez = [-1]
        # Scriem numerele care sunt divizori ai tuturor numerelor din șir în fișierul de ieșire
    else:  # P == 3
         fout.write(' '.join(str(i) for i in range(1, min(numbers) + 1) if all(num % i == 0 for num in numbers)))
        rez = []
        for x in sir:
            if all(y % x == 0 for y in sir):
                rez.append(x)
 
    with open('divizori2out.txt', 'a') as fout:
         fout.write(' '.join(map(str, rez)) + '\n')
 
 
if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 16:16, 25 December 2023

Cerinţa[edit | edit source]

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[edit | edit source]

Fişierul de intrare divizori2in.txt 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[edit | edit source]

Dacă valoarea lui P este 1, se va rezolva numai punctul 1) din cerinţă: fişierul divizori2out.txt 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 divizori2out.txt 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 divizori2out.txt va conţine pe prima linie doar numerele care sunt divizori ai tuturor numerelor din şir.

Restricţii şi precizări[edit | edit source]

  • 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[edit | edit source]

divizori2in.txt
1
7
12 18 8 4 13 6 17
divizori2out.txt
Datele de intrare corespund restrictiilor impuse
1 2 3 6 9 18

Exemplu 2[edit | edit source]

divizori2in.txt
2
7
12 18 8 4 13 6 17
divizori2out.txt
Datele de intrare corespund restrictiilor impuse
13 17

Exemplu 3[edit | edit source]

divizori2in.txt
4
7
12 18 8 4 13 6 17
divizori2out.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def divizori(n):

   div = [1, n]
   for i in range(2, int(n**0.5) + 1):
       if n % i == 0:
           div.append(i)
           if n // i != i:
               div.append(n // i)
   return sorted(div)


def este_prim(n):

   if n < 2:
       return False
   for i in range(2, int(n**0.5) + 1):
       if n % i == 0:
           return False
   return True


def validare(p, n, sir):

   if p not in [1, 2, 3]:
       return False, "Datele de intrare nu corespund restrictiilor impuse"
   if not 2 <= n <= 1000:
       return False, "Datele de intrare nu corespund restrictiilor impuse"
   for val in sir:
       if not isinstance(val, int) or not 1 <= val <= 10**6:
           return False, "Datele de intrare nu corespund restrictiilor impuse"
   return True, "Datele de intrare corespund restrictiilor impuse"


def main():

   with open('divizori2in.txt', 'r') as fin:
       p = int(fin.readline().strip())
       n = int(fin.readline().strip())
       sir = list(map(int, fin.readline().split()))
   valid, message = validare(p, n, sir)
   with open('divizori2out.txt', 'w') as fout:
       fout.write(message + '\n')
       if not valid:
           return
   if p == 1:
       max_n = max(sir)
       rez = divizori(max_n)
   elif p == 2:
       rez = [x for x in sir if este_prim(x)]
       if len(rez) == 0:
           rez = [-1]
   else:  # P == 3
       rez = []
       for x in sir:
           if all(y % x == 0 for y in sir):
               rez.append(x)
   with open('divizori2out.txt', 'a') as fout:
       fout.write(' '.join(map(str, rez)) + '\n')


if __name__ == "__main__":

   main()

</syntaxhighlight>

Explicatie[edit | edit source]

  • 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