2621 - Spower2: Difference between revisions

From Bitnami MediaWiki
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Enunt ==
== Enunt ==
Un număr natural M se numește număr spower2 dacă poate fi descompus astfel: M=2^x+2^y, cu x≠y. Exemplu: 6 este un număr spower2 (6=2+4), pe când 8 nu este.
Un număr natural '''M''' se numește număr '''spower2''' dacă poate fi descompus astfel: '''M=2^x+2^y''', cu '''x≠y'''. Exemplu: '''6''' este un număr '''spower2 (6=2+4)''', pe când '''8''' nu este.
== Cerința ==
== Cerința ==
Se consideră un șir A de n numere naturale. Pentru fiecare element al șirului Ai să se determine cel mai apropiat număr spower2 mai mare sau egal cu Ai, unde 1≤i≤n.
Se consideră un șir '''A''' de '''n''' numere naturale. Pentru fiecare element al șirului '''Ai''' să se determine cel mai apropiat număr '''spower2''' mai mare sau egal cu '''Ai''', unde '''1⩽i⩽n'''.
== Date de intrare ==
== Date de intrare ==
Fișierul de intrare spower2.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.
Fișierul de intrare '''spower2in.txt''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale separate prin spații.
== Date de ieșire ==
== Date de ieșire ==
Fișierul de ieșire spower2.out va conține pe prima linie n numere naturale, separate prin spațiu, ce reprezintă numerele spower2 asociate numerelor citite din fișier conform cerinței.
Fișierul de ieșire '''spower2out''' va conține pe prima linie '''n''' numere naturale, separate prin spațiu, ce reprezintă numerele '''spower2''' asociate numerelor citite din fișier conform cerinței.
== Restricții și precizări ==
== Restricții și precizări ==
*1 ⩽ n ⩽ 100 000
*'''1 ⩽ n ⩽ 100 000'''
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât '''1.000.000.000'''
== Exemplu 1 ==
== Exemplu 1 ==
;spower2.in
;'''spower2in.txt'''
:6
:6
:14 8 5 19 1 6
:14 8 5 19 1 6
;spower2.out
;'''spower2out.txt'''
:17 9 5 20 3 6
:17 9 5 20 3 6
<br>
<br>
== Exemplu 2 ==
== Exemplu 2 ==
;spower2.in
;'''spower2in.txt'''
:0
:0
:0
;  
;'''spower2out.txt'''
: Numarul nu respecta restrictiile.
: Numarul nu respecta restrictiile.
<br>
<br>


== Explicatie ==
== Explicatie ==
17=1+16, 9=1+8, 5=1+4, 20=4+16, 3=1+2, 6=2+4.
'''17=1+16, 9=1+8, 5=1+4, 20=4+16, 3=1+2, 6=2+4.'''
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
#2621 - Spower2
#2621 - Spower2
<syntaxhighlight lang="python" line>
def is_spower2(num):
def is_spower2(num):
     # Funcția verifică dacă un număr este spower2
     """
     for x in range(1, num):
    Verifică dacă un număr este de tip spower2
         for y in range(x + 1, num):
    """
             if 2 * x + 2 * y == num:
     for i in range(31):
         for j in range(i+1, 32):
             if 2**i + 2**j == num:
                 return True
                 return True
     return False
     return False


def find_spower2(num):
def spower2_associate(file_input, file_output):
     # Funcția găsește cel mai apropiat număr spower2 mai mare sau egal cu num
     try:
    spower2 = num
        # Citirea datelor de intrare din fișier
    while not is_spower2(spower2):
        with open(file_input, 'r') as f:
        spower2 += 1
            n = int(f.readline().strip())
    return spower2
            A = list(map(int, f.readline().split()))
 
        # Determinarea celor mai apropiate numere spower2
        spower2_list = [min(filter(lambda x: x >= num and is_spower2(x), range(1, 2*max(A)+1)), key=lambda x: x - num) for num in A]


# Citirea datelor din fișierul de intrare
        # Scrierea rezultatului în fișierul de ieșire
with open("spower2.in", "r") as infile:
        with open(file_output, 'w') as f:
    n = int(infile.readline())
            f.write(' '.join(map(str, spower2_list)))
    numbers = list(map(int, infile.readline().split()))


# Găsirea numărului spower2 pentru fiecare element din șir și scrierea rezultatelor în fișierul de ieșire
    except Exception as e:
with open("spower2.out", "w") as outfile:
        # În caz de eroare, afișăm un mesaj corespunzător
    for num in numbers:
        with open(file_output, 'w') as f:
        spower2_num = find_spower2(num)
            f.write('Numarul nu respecta restrictiile.')
        outfile.write(str(spower2_num) + " ")


# Funcția pentru verificarea numerelor introduse de la tastatură
# Exemplu de utilizare:
def validate_input():
spower2_associate('spower2in.txt', 'spower2out.txt')
    while True:
        try:
            num = int(input("Introduceți un număr natural mai mic decât 1.000.000.000: "))
            if num < 1 or num >= 1000000000:
                print("Numărul nu respectă restricțiile.")
            else:
                return num
        except ValueError:
            print("Introduceți un număr valid.")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:02, 5 January 2024

Enunt[edit | edit source]

Un număr natural M se numește număr spower2 dacă poate fi descompus astfel: M=2^x+2^y, cu x≠y. Exemplu: 6 este un număr spower2 (6=2+4), pe când 8 nu este.

Cerința[edit | edit source]

Se consideră un șir A de n numere naturale. Pentru fiecare element al șirului Ai să se determine cel mai apropiat număr spower2 mai mare sau egal cu Ai, unde 1⩽i⩽n.

Date de intrare[edit | edit source]

Fișierul de intrare spower2in.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.

Date de ieșire[edit | edit source]

Fișierul de ieșire spower2out va conține pe prima linie n numere naturale, separate prin spațiu, ce reprezintă numerele spower2 asociate numerelor citite din fișier conform cerinței.

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

  • 1 ⩽ n ⩽ 100 000
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000

Exemplu 1[edit | edit source]

spower2in.txt
6
14 8 5 19 1 6
spower2out.txt
17 9 5 20 3 6


Exemplu 2[edit | edit source]

spower2in.txt
0
0
spower2out.txt
Numarul nu respecta restrictiile.


Explicatie[edit | edit source]

17=1+16, 9=1+8, 5=1+4, 20=4+16, 3=1+2, 6=2+4.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2621 - Spower2

def is_spower2(num):

   """
   Verifică dacă un număr este de tip spower2
   """
   for i in range(31):
       for j in range(i+1, 32):
           if 2**i + 2**j == num:
               return True
   return False

def spower2_associate(file_input, file_output):

   try:
       # Citirea datelor de intrare din fișier
       with open(file_input, 'r') as f:
           n = int(f.readline().strip())
           A = list(map(int, f.readline().split()))
       # Determinarea celor mai apropiate numere spower2
       spower2_list = [min(filter(lambda x: x >= num and is_spower2(x), range(1, 2*max(A)+1)), key=lambda x: x - num) for num in A]
       # Scrierea rezultatului în fișierul de ieșire
       with open(file_output, 'w') as f:
           f.write(' '.join(map(str, spower2_list)))
   except Exception as e:
       # În caz de eroare, afișăm un mesaj corespunzător
       with open(file_output, 'w') as f:
           f.write('Numarul nu respecta restrictiile.')
  1. Exemplu de utilizare:

spower2_associate('spower2in.txt', 'spower2out.txt')

</syntaxhighlight>