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 încape în 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 încape în ea, 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.
Prima săptămână este gratuită, fără plată și fără card. Dacă vrei să vezi mai întâi cum este scrisă o rezolvare, poți reveni la prima cerință a anului.
100 RON / lună, pentru o disciplină
Ce cuprinde:
- Două întâlniri de câte două ore, în fiecare lună
- Tot suportul de curs publicat până acum la disciplina aleasă
- Capitole noi în fiecare săptămână, cuprinse în luna plătită, fără costuri suplimentare
- Material organizat după structura programei de examen
- Acces de pe orice dispozitiv, folosind același cont
- Prima săptămână gratuită, fără card și fără reînnoire automată
Ai întrebări sau o problemă? Scrie-mi pe WhatsApp, la 0745 874 576.