1505 - B 210

From Bitnami MediaWiki
Revision as of 08:21, 28 March 2024 by Cristina94 (talk | contribs) (Pagină nouă: ==Enunţ== Vasilică tocmai a învăţat la şcoală despre sistemul de numeraţie cu baza 2. I se pare interesant şi a inventat jocul b210, pe care vrea să îl joace cu prietenul său Gigel. Vasilică îi spune lui Gigel un număr natural nenul n, scris în baza 10. Gigel trebuie să scrie numărul în baza 2, obţinând astfel o secvenţă de cifre binare, care începe cu 1. Asupra scrierii în baza 2 a numărului n Gigel poate aplica una sau mai multe permutări circular...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunţ[edit | edit source]

Vasilică tocmai a învăţat la şcoală despre sistemul de numeraţie cu baza 2. I se pare interesant şi a inventat jocul b210, pe care vrea să îl joace cu prietenul său Gigel. Vasilică îi spune lui Gigel un număr natural nenul n, scris în baza 10. Gigel trebuie să scrie numărul în baza 2, obţinând astfel o secvenţă de cifre binare, care începe cu 1. Asupra scrierii în baza 2 a numărului n Gigel poate aplica una sau mai multe permutări circulare. Printr-o permutare circulară, toate cifrele secvenţei date, exceptând ultima, sunt mutate cu o poziţie spre dreapta, iar ultima cifră devine prima.

De exemplu, dacă n=107, scrierea sa în baza 2 este 1101011. Prin permutări circulare succesive putem obţine, în ordine, secvenţele:

1110101
1111010
0111101
1011110
...

Fiecare astfel de secvenţă este scrierea în baza 2 a unui număr natural, pe care Gigel îl transformă în baza 10. Gigel trebuie să afle care este cel mai mare număr natural m, scris în baza 10, a cărui scriere în baza 2 se poate obţine prin una sau mai multe permutări circulare ale scrierii în baza 2 a numărului n. Lui Gigel jocul nu i se pare aşa interesant şi ar prefera să aibă un program care să determine în locul lui numărul natural m.

Cerința[edit | edit source]

Scrieţi un program care citeşte numărul natural nenul n şi care determină cel mai mare număr natural m, scris în baza 10, care poate fi obţinut prin una sau mai multe permutări circulare ale scrierii în baza 2 a numărului natural n.

Date de intrare[edit | edit source]

Fișierul de intrare b210.in conține pe prima linie numărul natural nenul n.

Date de ieșire[edit | edit source]

Fișierul de ieșire b210.out va conține pe prima linie numărul natural m, cu semnificaţia din enunţ.

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

0 < n ≤ 1.000.000.000

Exemplu1[edit | edit source]

b210.in
13
b210.out
14

Explicație[edit | edit source]

Scrierea în baza 2 a lui 13 este 1101.

Numărul maxim scris în baza 10 a cărui scriere în baza 2 se poate obţine din permutări circulare ale scrierii în baza 2 a lui 13 este 14, a cărui scriere în baza 2 este 1110.

Exemplu2[edit | edit source]

b210.in
-10
b210.out
Date invalide in fisierul de intrare.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1505 B210

def decimal_to_binary(n):

 # Convertim numărul din baza 10 în baza 2
 return bin(n)[2:]

def rotate_left(s):

 # Rotim cifrele la stânga
 return s[1:] + s[0]

def find_largest_permuted_number(n):

 binary = decimal_to_binary(n)
 largest_number = n
 
 # Generăm toate permutările circulare
 for _ in range(len(binary) - 1):
     binary = rotate_left(binary)
     # Convertim înapoi în baza 10
     num = int(binary, 2)
     # Actualizăm cel mai mare număr
     largest_number = max(largest_number, num)
 
 return largest_number

def is_valid_input(n):

 # Verificăm dacă numărul este nenul și se încadrează în limitele impuse
 return 0 < n <= 1000000000

def main():

 with open("b210.in", "r") as f_in:
   n = int(f_in.readline().strip())
 if not is_valid_input(n):
   with open("b210.out", "w") as f_out:
     f_out.write("Date invalide in fisierul de intrare.")
   return
 
 # Determinăm cel mai mare număr permis
 largest_number = find_largest_permuted_number(n)
 
 # Scriem rezultatul în fișierul de ieșire
 with open("b210.out", "w") as f:
   f.write(str(largest_number))

if __name__ == "__main__":

 main()

</syntaxhighlight>