2621 - Spower2: Difference between revisions

From Bitnami MediaWiki
No edit summary
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 ==
;spower2in.txt
;'''spower2in.txt'''
:6
:6
:14 8 5 19 1 6
:14 8 5 19 1 6
;spower2out.txt
;'''spower2out.txt'''
:17 9 5 20 3 6
:17 9 5 20 3 6
<br>
<br>


== Exemplu 2 ==
== Exemplu 2 ==
;spower2in.txt
;'''spower2in.txt'''
:0
:0
;spower2out.txt
;'''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 ==


Line 32: Line 32:
#2621 - Spower2
#2621 - Spower2
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()))


# Citirea datelor din fișierul de intrare
        # Determinarea celor mai apropiate numere spower2
with open("spower2in.txt", "r") as infile:
        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]
    n = int(infile.readline())
    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
        # Scrierea rezultatului în fișierul de ieșire
with open("spower2out.txt", "w") as outfile:
        with open(file_output, 'w') as f:
    for num in numbers:
            f.write(' '.join(map(str, spower2_list)))
        spower2_num = find_spower2(num)
        outfile.write(str(spower2_num) + " ")


# Funcția pentru verificarea numerelor introduse de la tastatură
    except Exception as e:
def validate_input():
        # În caz de eroare, afișăm un mesaj corespunzător
    while True:
        with open(file_output, 'w') as f:
        try:
             f.write('Numarul nu respecta restrictiile.')
             num = int(input("Introduceți un număr natural mai mic decât 1.000.000.000: "))
 
            if num < 1 or num >= 1000000000:
# Exemplu de utilizare:
                print("Numărul nu respectă restricțiile.")
spower2_associate('spower2in.txt', 'spower2out.txt')
            else:
                return num
        except ValueError:
            print("Introduceți un număr valid.")


</syntaxhighlight>
</syntaxhighlight>

Revision as of 12:01, 5 January 2024

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.

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.

Date de intrare

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

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

  • 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

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


Exemplu 2

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


Explicatie

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

Rezolvare

<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>