3266 - Sir147
Cerință
Fișierul sir147in.txt 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 sir147out.txt 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 sir147in.txt 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 sir147out.txt 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
Exemplul 1
sir147in.txt
1 2 5 7 13 17 19 30
sir147out.txt
Datele de intrare corespund restrictiilor impuse 1 7 13 19
Exemplul 2
sir147in.txt
sir147
sir147out.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare
<syntaxhighlight lang="python" line="1" start="1">
def validare(numere): # functia de validare a datelor de intrare
for number in numere: if not isinstance(number, int) or number >= 1000000000: # fiecare număr trebuie să fie întreg și mai mic decât 1.000.000.000 raise ValueError
file_out.write("Datele de intrare corespund restrictiilor impuse\n")
def sir147(numere): # functia de rezolvare
f1, f2 = 1, 4 current = f1
for number in numere: while number > current: current = f2 f1, f2 = f2, f2 * 2 - f1 if number == current: file_out.write(str(number) + ' ')
if __name__ == '__main__':
file_in = open("sir147in.txt", "r") # declararea fisierelor file_out = open("sir147out.txt", "w") # fisierul out trebuie declarat cu optiunea "w" (write)
try: numbers = list(map(int, file_in.readline().split())) # citirea numerelor se face ca listă de întregi
validare(numbers) # apelul functiei de validare sir147(numbers) # apelul functiei de rezolvare
except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse")
</syntaxhighlight>
Explicație
Numerele din fișierul de intrare care sunt termeni ai șirului menționat sunt 1 7 13 19.