2351 - Numere 23: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Cerința== Se numește număr 3-prim, un număr natural care se poate descompune în produs de cel mult <code>3</code> numere prime, nu neapărat distincte. Cunoscând numerele naturale <code>n</code> și <code>k</code>, construiți un șir format din primele <code>n</code> numere 3-prime. Ordinea numerelor în șir va fi stabilită astfel încât, extrăgând pe rând numerele din șir, începând cu primul număr și apoi câte un număr din <code>k</code> în <code>k</co...
 
No edit summary
 
(4 intermediate revisions by the same user not shown)
Line 11: Line 11:
Fișierul de intrare <code>numere23.in</code> conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale <code>n</code>, <code>k</code> și <code>c</code>, cu semnificaţia din enunţ.
Fișierul de intrare <code>numere23.in</code> conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale <code>n</code>, <code>k</code> și <code>c</code>, cu semnificaţia din enunţ.
==Date de ieșire==
==Date de ieșire==
Dacă <code>c = 1</code>, atunci pe prima linie a fişierului <code>numere23.out</code> va fi scris un singur număr ce reprezintă cel mai mare din cele <code>n</code> numere 3-prime. Dacă <code>c = 2</code>, atunci fişierul <code>numere23.out</code> va conţine despărțite prin câte un spațiu, șirul celor <code>n</code> numere 3-prime.
Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."
 
Dacă <code>c = 1</code>, atunci pe următorul rând se va afișa un singur număr ce reprezintă cel mai mare din cele <code>n</code> numere 3-prime. Dacă <code>c = 2</code>, atunci se vor afișa despărțite prin câte un spațiu, șirul celor <code>n</code> numere 3-prime.
 
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."
==Restricții și precizări==
==Restricții și precizări==


Line 22: Line 26:
:5  3  2
:5  3  2
;Ieșire
;Ieșire
:Datele de intrare corespund restricțiilor impuse.
:2 6 4 3 5
:2 6 4 3 5
===Explicație===
===Explicație===
Line 29: Line 34:
:10 4  2
:10 4  2
;Ieșire
;Ieșire
:Datele de intrare corespund restricțiilor impuse.
:2 11 10 5 3 8 7 9 4 6
:2 11 10 5 3 8 7 9 4 6
===Explicație===
===Explicație===
Line 36: Line 42:
:5  3  1
:5  3  1
;Ieșire
;Ieșire
:Datele de intrare corespund restricțiilor impuse.
:6
:6
===Explicație===
===Explicație===
Line 43: Line 50:
:3  10  1
:3  10  1
;Ieșire
;Ieșire
:Date de intrare gresite!
:Datele de intrare nu corespund restricțiilor impuse.
==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line="1">
<syntaxhighlight lang="python" line="1">
#2351 Numere 23
#2351 Numere 23
def conditii(k, n):
    return 0 < k < n <= 10_000


def prim3(n):
def prim3(n):
    # Dacă n este mai mic decât 2, nu este 3-prim
     if n < 2:
     if n < 2:
         return False
         return False
     d, nr = 2, 0
 
     while n != 1 and nr <= 3:
     divizor, nr_factori_primi = 2, 0
         while n % d == 0 and nr <= 3:
    # Cât timp n este mai mare decât 1 și nu am găsit 3 factori primi:
             n //= d
     while n != 1 and nr_factori_primi <= 3:
             nr += 1
        # Cât timp n este divizibil cu divizorul curent și nu am găsit 3 factori primi:
         d += 1
         while n % divizor == 0 and nr_factori_primi <= 3:
     if n == 1 and nr <= 3:
            # Împărțim n la divizorul curent și creștem numărul de factori primi găsiți
             n //= divizor
             nr_factori_primi += 1
         # Trecem la următorul divizor
        divizor += 1
 
    # Dacă n este 1 și am găsit 3 factori primi, n este 3-prim
     if n == 1 and nr_factori_primi <= 3:
         return True
         return True


Line 64: Line 82:


def cel_mai_mare(n):
def cel_mai_mare(n):
     res = 1
     rezultat = 1
    # Cât timp n este nenul:
     while n > 0:
     while n > 0:
         res += 1
         # Creștem rezultatul până când găsim un număr 3-prim
         if prim3(res):
        rezultat += 1
        # Dacă rezultatul este 3-prim, scădem 1 din n
         if prim3(rezultat):
             n -= 1
             n -= 1


     return res
     return rezultat




def sir_circular(n, k):
def sir_circular(n, k):
     val, poz, nr_n = 1, 1, n
     val, poz, nr_n = 1, 1, n
    # Găsim cel mai mic număr 3-prim și îl asignăm pe prima poziție din vector
     while not prim3(val):
     while not prim3(val):
         val += 1
         val += 1
Line 81: Line 103:
     nr_n -= 1
     nr_n -= 1


    # Continuăm să adăugăm numere 3-prime în vector până când vectorul conține n numere
     while nr_n > 0:
     while nr_n > 0:
        # Căutăm următorul număr 3-prim și îl asignăm pe poziția curentă din vector
         val += 1
         val += 1
         while not prim3(val):
         while not prim3(val):
             val += 1
             val += 1
        # Trecem la următoarea poziție liberă din vector
         nr_k = k
         nr_k = k
         while nr_k > 0:
         while nr_k > 0:
Line 92: Line 118:
             if vector[poz] == 0:
             if vector[poz] == 0:
                 nr_k -= 1
                 nr_k -= 1
        # Asignăm numărul 3-prim curent pe poziția curentă din vector
         vector[poz] = val
         vector[poz] = val
         nr_n -= 1
         nr_n -= 1
   
    # Returnăm numerele din vector separate prin câte un spațiu
    return " ".join(str(x) for x in vector[1:])


    return " ".join(str(x) for x in v[1:])
def conditii(k, n):
    return 0 < k < n <= 10_000
def main():
    n, k, c = map(int, input().split())
    if not conditii(k, n):
        return print("Date de intrare gresite!")


def numere23(c, n, k):
    # c este cerința enunțului
     if c == 1:
     if c == 1:
         print(cel_mai_mare(n))
         print(cel_mai_mare(n))
Line 115: Line 136:


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     n, k, c = map(int, input().split())
 
    if not conditii(k, n):
        print("Datele de intrare nu corespund restricțiilor impuse.")
    else:
        print("Datele de intrare corespund restricțiilor impuse.")
        numere23(c, n, k)


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 14:54, 6 May 2023

Cerința[edit | edit source]

Se numește număr 3-prim, un număr natural care se poate descompune în produs de cel mult 3 numere prime, nu neapărat distincte. Cunoscând numerele naturale n și k, construiți un șir format din primele n numere 3-prime. Ordinea numerelor în șir va fi stabilită astfel încât, extrăgând pe rând numerele din șir, începând cu primul număr și apoi câte un număr din k în k poziții, circular, să obținem în ordine crescătoare, șirul primelor n numere 3-prime. Parcurgerea circulară înseamnă că după elementul aflat în vector pe locul n, urmează elementul de pe locul 1.

Cunoscând numerele n, k și c (c = 1 sau c = 2), se cere:

1. dacă c = 1, să se afișeze cel mai mare din cele n numere 3-prime.

2. dacă c = 2, să se construiască șirul de n numere care îndeplinește condiția din enunț.

Date de intrare[edit | edit source]

Fișierul de intrare numere23.in conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale n, k și c, cu semnificaţia din enunţ.

Date de ieșire[edit | edit source]

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."

Dacă c = 1, atunci pe următorul rând se va afișa un singur număr ce reprezintă cel mai mare din cele n numere 3-prime. Dacă c = 2, atunci se vor afișa despărțite prin câte un spațiu, șirul celor n numere 3-prime.

În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."

Restricții și precizări[edit | edit source]

  • 0 < k < n ≤ 10000
  • numerotarea elementelor în vector se face de la 1

Exemplu 1[edit | edit source]

Intrare
5 3 2
Ieșire
Datele de intrare corespund restricțiilor impuse.
2 6 4 3 5

Explicație[edit | edit source]

Primele cinci numere 3-prime sunt: 2, 3, 4, 5, și 6. Șirul de numere 2, 6, 4, 3, 5 parcurs din 3 în 3, va forma în ordine crescătoare șirul de numere inițial.

Exemplu 2[edit | edit source]

Intrare
10 4 2
Ieșire
Datele de intrare corespund restricțiilor impuse.
2 11 10 5 3 8 7 9 4 6

Explicație[edit | edit source]

Primele 10 numere 3-prime sunt: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Șirul de numere 2, 11, 10, 5, 3, 8, 7, 9, 4, 6, parcurs din 4 în 4, va forma în ordine crescătoare șirul de numere inițial.

Exemplu 3[edit | edit source]

Intrare
5 3 1
Ieșire
Datele de intrare corespund restricțiilor impuse.
6

Explicație[edit | edit source]

Primele 10 numere 3-prime sunt: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Șirul de numere 2, 11, 10, 5, 3, 8, 7, 9, 4, 6, parcurs din 4 în 4, va forma în ordine crescătoare șirul de numere inițial.

Exemplu 4[edit | edit source]

Intrare
3 10 1
Ieșire
Datele de intrare nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 2351 Numere 23

def conditii(k, n):

   return 0 < k < n <= 10_000


def prim3(n):

   # Dacă n este mai mic decât 2, nu este 3-prim
   if n < 2:
       return False
   divizor, nr_factori_primi = 2, 0
   # Cât timp n este mai mare decât 1 și nu am găsit 3 factori primi:
   while n != 1 and nr_factori_primi <= 3:
       # Cât timp n este divizibil cu divizorul curent și nu am găsit 3 factori primi:
       while n % divizor == 0 and nr_factori_primi <= 3:
           # Împărțim n la divizorul curent și creștem numărul de factori primi găsiți
           n //= divizor
           nr_factori_primi += 1
       # Trecem la următorul divizor
       divizor += 1
   # Dacă n este 1 și am găsit 3 factori primi, n este 3-prim
   if n == 1 and nr_factori_primi <= 3:
       return True
   return False


def cel_mai_mare(n):

   rezultat = 1
   # Cât timp n este nenul:
   while n > 0:
       # Creștem rezultatul până când găsim un număr 3-prim
       rezultat += 1
       # Dacă rezultatul este 3-prim, scădem 1 din n
       if prim3(rezultat):
           n -= 1
   return rezultat


def sir_circular(n, k):

   val, poz, nr_n = 1, 1, n
   # Găsim cel mai mic număr 3-prim și îl asignăm pe prima poziție din vector
   while not prim3(val):
       val += 1
   vector = [0] * (n + 1)
   vector[1] = val
   nr_n -= 1
   # Continuăm să adăugăm numere 3-prime în vector până când vectorul conține n numere
   while nr_n > 0:
       # Căutăm următorul număr 3-prim și îl asignăm pe poziția curentă din vector
       val += 1
       while not prim3(val):
           val += 1
       # Trecem la următoarea poziție liberă din vector
       nr_k = k
       while nr_k > 0:
           poz += 1
           if poz > n:
               poz = poz % n
           if vector[poz] == 0:
               nr_k -= 1
       # Asignăm numărul 3-prim curent pe poziția curentă din vector
       vector[poz] = val
       nr_n -= 1
   
   # Returnăm numerele din vector separate prin câte un spațiu
   return " ".join(str(x) for x in vector[1:])


def numere23(c, n, k):

   # c este cerința enunțului
   if c == 1:
       print(cel_mai_mare(n))
   elif c == 2:
       print(sir_circular(n, k))


if __name__ == "__main__":

   n, k, c = map(int, input().split())
   if not conditii(k, n):
       print("Datele de intrare nu corespund restricțiilor impuse.")
   else:
       print("Datele de intrare corespund restricțiilor impuse.")
       numere23(c, n, k)

</syntaxhighlight>