1647 - Cumpanit

From Bitnami MediaWiki

Enunt[edit | edit source]

Un număr natural nenul n se numește cumpănit dacă în descompunerea sa în factori primi suma bazelor este egală cu suma exponenților. De exemplu, numerele 72 = 2^3 * 3^2 , 5760 = 2^7 * 3^2 * 5^1 sunt cumpănite.

Cerința[edit | edit source]

Să se scrie un program care citește două numere naturale nenule a și b și determină toate numerele cumpănite din intervalul închis [a, b]. De exemplu, dacă a=2 și b=99, numerele cumpănite cuprinse între 2 şi 99 sunt 4, 27, 48 şi 72.

Date de intrare[edit | edit source]

Fişierul de intrare cumpanitin.txt conţine pe prima linie numerele naturale nenule a și b despărțite prin exact un spațiu, cu semnificaţia de mai sus.

Date de ieșire[edit | edit source]

Fişierul de ieşire cumpanitout.txt va conţine numerele căutate, scrise în ordine crescătoare, câte unul pe fiecare linie.

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

  • 2 ⩽ a ⩽ b ⩽ 10^14.
  • Pentru 25% din teste se garantează că 2 ≤ a ≤ b ≤ 106.

Exemplu 1[edit | edit source]

cumpanitin.txt
2 99
cumpanitout.txt
Datele corespund
4
27
48
72


Exemplu 2[edit | edit source]

cumpanitin.txt
1 0 -1
cumpanitout.txt
Datele nu corespund


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1647 - Cumpanit

def este_cumpanit(numar):

   # Calculează descompunerea în factori primi și verifică condiția cumpănită
   divizor = 2
   suma_baze = 0
   suma_exponenti = 0
   while numar > 1:
       putere = 0
       while numar % divizor == 0:
           numar //= divizor
           putere += 1
       if putere > 0:
           suma_baze += divizor
           suma_exponenti += putere
       divizor += 1
   return suma_baze == suma_exponenti


def main():

   try:
       with open("cumpanitin.txt", "r") as fin:
           a, b = map(int, fin.readline().strip().split())
   except FileNotFoundError:
       print("Fișierul cumpanitin.txt nu a fost găsit.")
       return
   except ValueError:
       print("Datele din fișierul de intrare nu sunt corecte.")
       return
   if not (2 <= a <= b <= 10 ** 14):
       print("Datele nu corespund restricțiilor.")
       return
   try:
       with open("cumpanitout.txt", "w") as fout:
           for numar in range(a, b + 1):
               if este_cumpanit(numar):
                   fout.write(str(numar) + "\n")
       print("Datele corespund.")
   except IOError:
       print("Nu s-a putut scrie în fișierul de ieșire.")


if __name__ == "__main__":

   main()

</syntaxhighlight>