3311 - Nr Reg: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == Enunt == Numerele regulate sunt numerele ce au ca factori primi doar numerele 2, 3 și 5. Primele 20 de numere regulate sunt: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36. == Cerinta == Fișierul de intrare nrreg.in conține pe prima linie numărul natural n (n<=10000). Scrieți un program care determină: *cel de-al n-lea număr regulat, x; *cel mai mic divizor d al lui x cu proprietatea că p = x / d este pătrat perfect; *valoarea p. Progra...)
 
 
(Nu s-au afișat 2 versiuni intermediare efectuate de același utilizator)
Linia 1: Linia 1:
== Enunt ==
== Enunt ==


Numerele regulate sunt numerele ce au ca factori primi doar numerele 2, 3 și 5. Primele 20 de numere regulate sunt: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36.
'''Numerele regulate''' sunt numerele ce au ca factori primi doar numerele '''2, 3 și 5'''. Primele 20 de numere regulate sunt: '''1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36'''.


== Cerinta ==
== Cerinta ==


Fișierul de intrare nrreg.in conține pe prima linie numărul natural n (n<=10000). Scrieți un program care determină:
Fișierul de intrare '''nrregin.txt''' conține pe prima linie numărul natural '''n (n<=10000)'''. Scrieți un program care determină:


*cel de-al n-lea număr regulat, x;
*cel de-al '''n'''-lea număr regulat, '''x''';
*cel mai mic divizor d al lui x cu proprietatea că p = x / d este pătrat perfect;
*cel mai mic divizor '''d''' al lui '''x''' cu proprietatea că '''p = x / d''' este pătrat perfect;
*valoarea p.
*valoarea p.
Programul va scrie în fișierul nrreg.out valorile x d p, separate prin câte spațiu.
Programul va scrie în fișierul '''nrregout.txt''' valorile '''x d p''', separate prin câte spațiu.


Exemplu: dacă n=10, al zecelea număr regulat este x=12; d=3, iar p=4.
Exemplu: dacă n=10, al zecelea număr regulat este x=12; d=3, iar p=4.
Linia 16: Linia 16:
== Date de intrare ==
== Date de intrare ==


Fișierul de intrare nrreg.txt conține pe prima linie numărul natural n.
Fișierul de intrare '''nrregin.txt conține pe prima linie numărul natural '''n'''.


== Date de iesire ==
== Date de iesire ==


Fișierul de ieșire nrreg.txt va conține pe prima linie numărul x d p, separate prin câte un spațiu.
Fișierul de ieșire '''nrregout.txt''' va conține pe prima linie numărul '''x d p''', separate prin câte un spațiu.


== Restrictii si precizari ==
== Restrictii si precizari ==


*1 n 10000
*1 &les; n &les; 10000
*prin convenție s-a stabilit că numărul 1 face parte din șirul numerelor regulate.
*prin convenție s-a stabilit că numărul 1 face parte din șirul numerelor regulate.


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;nrregin.txt
:10
:10
;Iesire
;nrregout.txt
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:12 3 4
:12 3 4


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;nrrgin.txt
:17
:17
;Iesire
:Datele introduse nu corespund restrictiilor impuse
;Datele introduse nu corespund restrictiilor impuse




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def este_patrat_perfect(numar):
def cel_mai_mic_divizor_patratic(n):
    radacina = int(numar**0.5)
    return radacina * radacina == numar
 
def gaseste_nr_regulat(n):
     numere_regulate = [1]
     numere_regulate = [1]
    index_2 = index_3 = index_5 = 0
     while len(numere_regulate) < n:
     while len(numere_regulate) < n:
         next_2 = numere_regulate[index_2] * 2
         for x in numere_regulate:
        next_3 = numere_regulate[index_3] * 3
            for d in [2, 3, 5]:
         next_5 = numere_regulate[index_5] * 5
                if x * d not in numere_regulate:
                    numere_regulate.append(x * d)
         numere_regulate.sort()


        next_min = min(next_2, next_3, next_5)
    x = numere_regulate[n - 1]
        numere_regulate.append(next_min)


        if next_min == next_2:
    # Determinăm cel mai mic divizor pătratic
            index_2 += 1
    d = 2
        if next_min == next_3:
    while x % (d ** 2) != 0:
            index_3 += 1
         d += 1
         if next_min == next_5:
            index_5 += 1


     return numere_regulate[-1]
    p = x // (d ** 2)
     return x, d, p


def cel_mai_mic_divizor_patrat_perfect(numar):
def verificare_rezultat(x, d, p):
     for d in range(2, numar + 1):
     # Adăugăm condițiile de verificare
        if numar % d == 0 and este_patrat_perfect(numar // d):
    return x % (d ** 2) == 0 and all(x % (f ** 2) == 0 for f in [2, 3, 5])
            return d


# Citire date de intrare
# Citire date de intrare
with open("nrreg.txt", "r") as fin:
with open("nrregin.txt", "r") as file:
     n = int(fin.readline().strip())
     n = int(file.readline())
 
# Determinare al n-lea număr regulat
x = gaseste_nr_regulat(n)
 
# Determinare cel mai mic divizor cu proprietatea cerută
d = cel_mai_mic_divizor_patrat_perfect(x)


# Determinare valoare p
# Calcul și afișare rezultat
p = x // d
rezultat = cel_mai_mic_divizor_patratic(n)


# Scriere rezultat in fisier
# Verificare rezultat
with open("nrreg.txt", "w") as fout:
if verificare_rezultat(*rezultat):
    fout.write(f"{x} {d} {p}")
    with open("nrregout.txt", "w") as file:
        file.write(" ".join(map(str, rezultat)) + "\n")
else:
    print("Rezultat invalid. Verificați condițiile.")


</syntaxhighlight>
</syntaxhighlight>

Versiunea curentă din 29 decembrie 2023 11:40

Enunt

Numerele regulate sunt numerele ce au ca factori primi doar numerele 2, 3 și 5. Primele 20 de numere regulate sunt: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36.

Cerinta

Fișierul de intrare nrregin.txt conține pe prima linie numărul natural n (n<=10000). Scrieți un program care determină:

  • cel de-al n-lea număr regulat, x;
  • cel mai mic divizor d al lui x cu proprietatea că p = x / d este pătrat perfect;
  • valoarea p.

Programul va scrie în fișierul nrregout.txt valorile x d p, separate prin câte spațiu.

Exemplu: dacă n=10, al zecelea număr regulat este x=12; d=3, iar p=4.

Date de intrare

Fișierul de intrare nrregin.txt conține pe prima linie numărul natural n.

Date de iesire

Fișierul de ieșire nrregout.txt va conține pe prima linie numărul x d p, separate prin câte un spațiu.

Restrictii si precizari

  • 1 ⩽ n ⩽ 10000
  • prin convenție s-a stabilit că numărul 1 face parte din șirul numerelor regulate.

Exemplul 1

nrregin.txt
10
nrregout.txt
Datele introduse corespund restrictiilor impuse
12 3 4

Exemplul 2

nrrgin.txt
17
Datele introduse nu corespund restrictiilor impuse


Rezolvare

def cel_mai_mic_divizor_patratic(n):
    numere_regulate = [1]
    while len(numere_regulate) < n:
        for x in numere_regulate:
            for d in [2, 3, 5]:
                if x * d not in numere_regulate:
                    numere_regulate.append(x * d)
        numere_regulate.sort()

    x = numere_regulate[n - 1]

    # Determinăm cel mai mic divizor pătratic
    d = 2
    while x % (d ** 2) != 0:
        d += 1

    p = x // (d ** 2)
    return x, d, p

def verificare_rezultat(x, d, p):
    # Adăugăm condițiile de verificare
    return x % (d ** 2) == 0 and all(x % (f ** 2) == 0 for f in [2, 3, 5])

# Citire date de intrare
with open("nrregin.txt", "r") as file:
    n = int(file.readline())

# Calcul și afișare rezultat
rezultat = cel_mai_mic_divizor_patratic(n)

# Verificare rezultat
if verificare_rezultat(*rezultat):
    with open("nrregout.txt", "w") as file:
        file.write(" ".join(map(str, rezultat)) + "\n")
else:
    print("Rezultat invalid. Verificați condițiile.")

Explicatie

Al zecelea număr regulat este 12; numărul minim care îl divide pe 12 pentru a obține un pătrat perfect este 3 iar pătratul perfect este 4.