3266 - Sir147

From Bitnami MediaWiki
Revision as of 21:11, 24 October 2023 by Bonte Lucas Gabriel (talk | contribs) (Pagină nouă: ==Cerință== Fișierul '''sir147.in''' memorează cel mult 10000 de numere naturale cu cel mult nouă cifre. Numerele sunt ordonate strict crescător și separate prin câte un spațiu. Se consideră șirul 1, 4, 7, …. definit astfel: f1=1, f2=4 si fn=fn−1∗2−fn−2, pentru '''n > 2'''. Se cere să se scrie în fișierul '''sir147.out''' numerele din fișier care sunt termeni ai șirului. Numerele sunt afișate în ordine strict crescătoare, separate prin câte un s...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerință

Fișierul sir147.in memorează cel mult 10000 de numere naturale cu cel mult nouă cifre. Numerele sunt ordonate strict crescător și separate prin câte un spațiu. Se consideră șirul 1, 4, 7, …. definit astfel: f1=1, f2=4 si fn=fn−1∗2−fn−2, pentru n > 2. Se cere să se scrie în fișierul sir147.out numerele din fișier care sunt termeni ai șirului. Numerele sunt afișate în ordine strict crescătoare, separate prin câte un spațiu.

Date de intrare

Fișierul de intrare sir147.in conține pe prima linie mai multe numere naturale formate din cel mult nouă cifre separate prin câte un spațiu.

Date de ieșire

Fișierul de ieșire sir147.out va conține pe prima linie numerele din fișier care sunt termeni ai șirului menționat în enunț.

Restricții și precizări

  • numerele din fișier vor fi mai mici decât 1.000.000.000
  • în fișierul de intrare există cel puțin un termen al șirului menționat mai sus
  • se recomandă realizarea unei soluții în care să se evite memorarea valorilor din fișier într-un tablou sau în alte structuri de date similare



Exemplu

sir147.in

1 2 5 7 13 17 19 30

sir147.out

1 7 13 19


Rezolvare

<syntaxhighlight lang="python" line="1" start="1"> def sir147():

   f1, f2 = 1, 4
   while True:
       yield f1
       f1, f2 = f2, f2 * 2 - f1

def main():

   with open('sir147.in', 'r') as fin:
       numbers = map(int, fin.readline().split())
   sir = sir147()
   current = next(sir)
   with open('sir147.out', 'w') as fout:
       for number in numbers:
           while number > current:
               current = next(sir)
           if number == current:
               fout.write(str(number) + ' ')

if __name__ == "__main__":

   main()

</syntaxhighlight>

Explicație

Numerele din fișierul de intrare care sunt termeni ai șirului menționat sunt 1 7 13 19.