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.
S-a încheiat minutul de citit liber.
Ce cuprinde rezolvarea
- Descrierea algoritmului în limbaj natural
- De ce soluția respectă condițiile din enunț
- Programul
- 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.