2812 - Progresie3: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/2812/progresie3 - Progresie3] ---- == Cerinţa == Un șir de numere este o '''progresie aritmetică de rație r''' dacă oricare termen al său, cu excepția primului, se obține din cel care îl precede, prin adunarea la acesta a numărului r. '''Exemplu''': șirul 12, 14, 16, 18, 20 este o progresie de rație 2. Se dă un șir de cel mult 1.000.000 numere naturale din intervalul [0,1.000]. Se cere să se verifice dacă există un num...
 
No edit summary
 
Line 83: Line 83:


</syntaxhighlight>
</syntaxhighlight>
==Explicaţie cod==
Funcția '''progresie(vector)''' primește un vector ca parametru și începe prin a deschide un fișier '''progresie3.out''' pentru a scrie rezultatul. Apoi, initializează două variabile ratie și '''r''' cu valoarea 0. Vectorul este sortat și apoi se parcurge prin el. Dacă două elemente consecutive sunt diferite, se calculează diferența dintre ele și se stochează în variabila '''ratie'''. De asemenea, valoarea acestei diferențe este stochează și în variabila '''r'''. Programul se oprește din parcurgerea vectorului la primul astfel de caz, deoarece nu mai este nevoie să verifice restul elementelor din vector.
După ce '''r''' a fost calculat, se parcurge din nou vectorul, de data aceasta pentru a verifica dacă toate diferențele dintre elementele consecutive ale vectorului sunt egale cu '''r'''. Dacă acest lucru este adevărat pentru toate diferențele, programul scrie valoarea '''r''' în fișierul de ieșire '''progresie3.out'''. Dacă se găsește o diferență care nu este egală cu '''r''', programul afișează '''NU''' și se oprește prin apelul funcției '''exit()'''.
Funcția '''conform_restrictiilor()''' primește ca input datele din fișierul '''progresie3.in''' și verifică dacă ele corespund restricțiilor impuse. Mai precis, datele din fișier trebuie să conțină între 2 și 1000000 de elemente și fiecare element trebuie să fie între 0 și 1000. De asemenea, toate elementele din '''vector''' trebuie să fie diferite. Dacă restricțiile nu sunt îndeplinite, programul afișează un mesaj corespunzător și se oprește prin apelul funcției '''exit()'''.
În funcția '''main()''', se apelează mai întâi funcția '''conform_restrictiilor()''' pentru a verifica dacă datele din fișier sunt valide și pentru a obține vectorul de numere. Apoi, se apelează funcția '''progresie(vector)''' pentru a determina dacă vectorul este o progresie aritmetică și pentru a afișa diferența în fișierul de ieșire sau '''NU''', după caz.

Latest revision as of 13:54, 30 April 2023

Sursa: - Progresie3


Cerinţa[edit | edit source]

Un șir de numere este o progresie aritmetică de rație r dacă oricare termen al său, cu excepția primului, se obține din cel care îl precede, prin adunarea la acesta a numărului r. Exemplu: șirul 12, 14, 16, 18, 20 este o progresie de rație 2.

Se dă un șir de cel mult 1.000.000 numere naturale din intervalul [0,1.000]. Se cere să se verifice dacă există un număr natural r, astfel încât toate numerele distincte din șir să poată fi rearanjate, pentru a forma o progresie aritmetică de rație r. Se afișează numărul r, sau mesajul NU, dacă nu există un astfel de număr.

Date de intrare[edit | edit source]

Fișierul de intrare progresie3.in conține cel mult 1.000.000 numere naturale din intervalul [0,1.000], separate prin spații.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fişierul e ieșire progresie3.out va conține pe prima linie numărul r, sau mesajul NU, dacă nu există un astfel de număr. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări[edit | edit source]

  • în șirul dat există cel puțin două valori distincte
  • proiectați un algoritm eficient din punctul de vedere al timpului de executare.

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

progresie3.in
180 30 80 280 130 330 230 30 30 330 80
Ieșire
Datele sunt corecte.
progresie3.out
50

Exemplul 2[edit | edit source]

progresie3.in
1 2 3 4 6
Ieșire
Datele sunt corecte.
progresie3.out
NU

Exemplul 3[edit | edit source]

progresie3.in
100 100 100
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2812 Progresie3

def progresie(vector):

   f = open("progresie3.out", "w")
   ratie = int()
   vector.sort()
   r = int()
   for i in range(len(vector) - 1):
       if vector[i] != vector[i + 1]:
           ratie = vector[i + 1] - vector[i]
           r = ratie
           break
   for i in range(len(vector) - 1):
       if vector[i] != vector[i + 1]:
           ratie = vector[i + 1] - vector[i]
           if ratie != r:
               f.write("NU")
               exit()
   f.write(str(r))


def conform_restrictiilor():

   vector = list()
   with open('progresie3.in') as f:
       lines = f.readlines()
       for line in lines:
           for c in line.split():
               if c.isdigit() == True:
                   vector.append(int(c))
   if len(vector) > 1000000 or vector.count(vector[0]) == len(vector):
       print("Datele nu sunt comform restricțiilor impuse.")
       exit()
   for x in vector:
       if x < 0 or x > 1000:
           print("Datele nu sunt comform restricțiilor impuse.")
           exit()
   print("Datele sunt corecte.")
   return vector


if __name__ == '__main__':

   vector = conform_restrictiilor()
   progresie(vector)


</syntaxhighlight>

Explicaţie cod[edit | edit source]

Funcția progresie(vector) primește un vector ca parametru și începe prin a deschide un fișier progresie3.out pentru a scrie rezultatul. Apoi, initializează două variabile ratie și r cu valoarea 0. Vectorul este sortat și apoi se parcurge prin el. Dacă două elemente consecutive sunt diferite, se calculează diferența dintre ele și se stochează în variabila ratie. De asemenea, valoarea acestei diferențe este stochează și în variabila r. Programul se oprește din parcurgerea vectorului la primul astfel de caz, deoarece nu mai este nevoie să verifice restul elementelor din vector.

După ce r a fost calculat, se parcurge din nou vectorul, de data aceasta pentru a verifica dacă toate diferențele dintre elementele consecutive ale vectorului sunt egale cu r. Dacă acest lucru este adevărat pentru toate diferențele, programul scrie valoarea r în fișierul de ieșire progresie3.out. Dacă se găsește o diferență care nu este egală cu r, programul afișează NU și se oprește prin apelul funcției exit().

Funcția conform_restrictiilor() primește ca input datele din fișierul progresie3.in și verifică dacă ele corespund restricțiilor impuse. Mai precis, datele din fișier trebuie să conțină între 2 și 1000000 de elemente și fiecare element trebuie să fie între 0 și 1000. De asemenea, toate elementele din vector trebuie să fie diferite. Dacă restricțiile nu sunt îndeplinite, programul afișează un mesaj corespunzător și se oprește prin apelul funcției exit().

În funcția main(), se apelează mai întâi funcția conform_restrictiilor() pentru a verifica dacă datele din fișier sunt valide și pentru a obține vectorul de numere. Apoi, se apelează funcția progresie(vector) pentru a determina dacă vectorul este o progresie aritmetică și pentru a afișa diferența în fișierul de ieșire sau NU, după caz.