0142 - n3579 - Obtinere numar prin aplicare repetata de operatii

From Bitnami MediaWiki

Cerința[edit | edit source]

Cunoscând numărul natural n,să se tipărească şirul de operaţii prin care se poate ajunge de la numărul iniţial 1 la numărul final n.

Date de intrare[edit | edit source]

Fişierul de intrare n311.in conţine pe prima linie valoarea numărului natural n.

Date de ieșire[edit | edit source]

Fişierul de ieşire n311.out va conţine pe prima linie şirul de operaţii format din numere întregi separate prin câte un spaţiu, cu semnificaţia de mai sus.

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

1 < n <= 2 000 000000; Pot exista mai multe soluţii, se acceptă oricare, dacă se încadrează în timpul de execuţie; Nu este obligatorie folosirea tuturor tipurilor de operaţii.

Exemplul 1[edit | edit source]

n311in.txt
24
n311out.txt
1 1 3 -1 3


Exemplul 2[edit | edit source]

n311in.txt
4
n311out.txt
1 1 1


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0142 - n3579 - Obtinere numar prin aplicare repetata de operatii

def verificare_restrictii(numar):

   if 1 < numar <= 2 000 000000:    
       return True
   else:
       return False

def construieste_sir_operatii(n):

   sir_operatii = []
   while n != 1:
       sir_operatii.append(n)
       if n % 3 == 0:
           n //= 3
       elif (n - 1) % 3 == 0 and n != 4:
           n -= 1
       else:
           n *= 3
   sir_operatii.append(1)
   sir_operatii.reverse()
   return sir_operatii

with open("n311in.txt", "r") as file_in:

   n = int(file_in.readline().strip())

sir_operatii = construieste_sir_operatii(n)

with open("n311out.txt", "w") as fileout.txt:

   file_out.write(" ".join(map(str, sir_operatii)))

</syntaxhighlight>