Sari la conținut
EduCamp
Definitivat2018Problemă15 puncte

Subiectul I, cerința 3

Suma de termeni ai unui șir

Subprogramul care determină cel mai mare termen al unui șir definit prin recurență, aflat în intervalul [1, n], și programul C++ care scrie n ca sumă de termeni ai șirului, fiecare folosit de cel mult două ori, cu algoritmul descris în limbaj natural.

Descrierea algoritmului în limbaj natural

Subprogramul termen. Dacă n este 1, subprogramul returnează 1, primul termen al șirului. Altfel, se generează termenii șirului în ordine crescătoare și se păstrează ultimii doi termeni calculați, a și b, cu valorile inițiale 1 și 2. Termenul următor se calculează cu formula de recurență, c = 1 + 3·b − 2·a. Cât timp c nu depășește n, cei doi termeni păstrați avansează cu o poziție: a primește valoarea lui b, iar b valoarea lui c, după care se calculează din nou c. La ieșirea din structura repetitivă, b este cel mai mare termen al șirului mai mic sau egal cu n, iar subprogramul îl returnează.

Determinarea termenilor sumei. Se citește n. Cât timp n este diferit de 0, se apelează subprogramul termen pentru valoarea curentă a lui n, termenul returnat se scrie în fișierul def.out, iar n se micșorează cu valoarea acestui termen. La fiecare pas se alege, deci, cel mai mare termen care nu depășește valoarea rămasă. Structura repetitivă se încheie când n devine 0, adică atunci când termenii scriși în fișier au suma egală cu valoarea citită.

Termenii se scriu în fișier în ordinea în care au fost determinați. Primul termen se scrie separat, iar fiecare termen următor este precedat de un spațiu, astfel încât valorile să fie separate prin câte un spațiu. La sfârșit fișierul se închide.

De ce soluția respectă condițiile din enunț

Termenii șirului au forma fi = 2i − i. Formula este adevărată pentru f1 = 2 − 1 = 1 și pentru f2 = 4 − 2 = 2, iar dacă este adevărată pentru fi-2 și fi-1, din relația de recurență rezultă:

fi = 1 + 3·(2i-1 − i + 1) − 2·(2i-2 − i + 2) = 2i − i.

Fie fk termenul ales la un pas, deci fk ≤ n < fk+1.

  • Termenii se scriu în ordine descrescătoare. Valoarea rămasă, n − fk, este mai mică decât fk+1, deci termenul ales la pasul următor este cel mult fk.
  • Un termen nu apare de trei ori. Dacă fk se alege de două ori, valoarea rămasă este n − 2·fk < fk+1 − 2·fk = k − 1. Pentru orice k ≥ 1, fk = 2k − k ≥ k − 1, deci valoarea rămasă este mai mică decât fk, iar fk nu mai poate fi ales a treia oară.
  • Structura repetitivă se termină. Primul termen al șirului este 1, deci pentru orice valoare rămasă nenulă există un termen care nu o depășește, iar n scade la fiecare pas.

Rezolvarea se poate citi pe educamp.ro, la adresa de mai sus.

Ce cuprinde rezolvarea

  1. Descrierea algoritmului în limbaj natural
  2. De ce soluția respectă condițiile din enunț
  3. Programul
  4. Verificarea pe exemplul din enunț

Vezi rezolvarea ca și cursant

Cel puțin o cerință din fiecare an este disponibilă gratuit și integral. Pentru a citi toate celelalte rezolvări ale disciplinei, te înscrii la cursul de pregătire.

Te înscrii, alegi în cont când începe cursul și plătești prima lună prin transfer bancar. Pentru a vedea mai întâi cum este scrisă o rezolvare, poți reveni la prima cerință a anului.

Acces la suportul de curs

25 RON / lună, fără ședințe

Ce cuprinde:

  • Acces la toate lecțiile disponibile
  • Suport de curs pentru tematica științifică și metodică
  • Exemple, explicații și exerciții
  • Acces la materialele noi adăugate pe platformă
  • Posibilitatea de a adresa întrebări

Poți alege și variante cu ședințe online, în grup sau individuale. Le vezi pe pagina cursului.

Ai întrebări sau o problemă? Scrie-mi pe WhatsApp, la 0745 874 576.

Înscrie-te Alte varianteCum plătești Login

Actualizat: 15 septembrie 2026