2969 - Cauta Fibo: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinţa == Se citesc pe rând numere naturale nenule. Să se determine câte din numerele citite sunt termeni ai șirului lui Fibonacci. == Date de intrare == Fișierul de intrare '''cautafibo.in''' conține numere naturale nenule, separate prin spații. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.",fișierul de ieșire '''cautafibo.out''' va conține o singură valoare, reprezentând numărul termenilor Fibonacci ca...
 
Line 36: Line 36:
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line="1">
<syntaxhighlight lang="python" line="1">
# 2827 - Sir 12
# 2969 - Cauta Fibo
def este_valid(fisier_intrare):
def este_valid(fisier_intrare):
     try:
     try:

Revision as of 15:32, 28 March 2023

Cerinţa

Se citesc pe rând numere naturale nenule. Să se determine câte din numerele citite sunt termeni ai șirului lui Fibonacci.

Date de intrare

Fișierul de intrare cautafibo.in conține numere naturale nenule, separate prin spații.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.",fișierul de ieșire cautafibo.out va conține o singură valoare, reprezentând numărul termenilor Fibonacci care se regăsesc în fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • numerele din fișierul de intrare vor avea cel mult 10 cifre
  • fișierul de intrare va conține cel mult 100.000 de numere naturale nenule

Exemple

Exemplul 1

cautafibo.in
5 10 89 1 7 9 8 1 6 55 19 13 55
ecran
Datele sunt introduse corect.
cautafibo.out
8

Exemplul 2

cautafibo.in
1 3 5 8 13 21 34 55 89 144
ecran
Datele sunt introduse corect.
cautafibo.out
10

Exemplul 3

cautafibo.in
-5 2 7 9 11 13 15
ecran
Datele nu corespund restricțiilor impuse.
cautafibo.out



Rezolvare

<syntaxhighlight lang="python" line="1">

  1. 2969 - Cauta Fibo

def este_valid(fisier_intrare):

   try:
       with open(fisier_intrare, 'r') as f:
           for line in f:
               nums = line.strip().split()
               for num in nums:
                   if not num.isnumeric() or int(num) < 1 or len(num) > 10:
                       print("Datele nu corespund restricțiilor impuse.")
                       return False
       print("Datele sunt introduse corect.")
       return True
   except:
       print("Datele nu corespund restricțiilor impuse.")
       return False

def rezolva(fisier_intrare):

   if not este_valid(fisier_intrare):
       return
   with open(fisier_intrare, 'r') as f, open('cautafibo.out', 'w') as g:
       a = [1, 1]
       while a[-1] <= 10000000001:
           a.append(a[-1] + a[-2])
       cnt = 0
       for line in f:
           nums = line.strip().split()
           for num in nums:
               x = int(num)
               poz = -1
               st, dr = 0, len(a) - 1
               while st <= dr:
                   m = (st + dr) // 2
                   if x <= a[m]:
                       poz = m
                       dr = m - 1
                   else:
                       st = m + 1
               if a[poz] == x:
                   cnt += 1
       g.write(str(cnt))

def main():

   rezolva('cautafibo.in')

main()







</syntaxhighlight>