Informatică, întrebare adresată de mneculea, 8 ani în urmă

am acest program:

cin >>a>>b;
S=0;
for(int n=a;n<=b;n++)
{ if(n%3==0)
S=S-n;
else
S=S+n;
}
cout <
Isi da seama cineva ce face acest program?
Inafara de faptul ca scade numerele divizibile cu 3 si le aduna pe restul din intervalul [a,b].
Cerinta propriu zisa era sa scriu programul fara structuri repetitive (while, for, do while).

de ex pt a=8, b=17 e raspunsul 53
Multumesc!


CinevaFaraNume: De ce mai intrebi daca ai inteles ce face? sau vrei o solutie fara structuri repetitive?

Răspunsuri la întrebare

Răspuns de CinevaFaraNume
1

Răspuns:

#include <iostream>

using namespace std;

int main(){

int a,b;

cin >> a >> b;

int c,d,e,f,s,t;

c = b - a + 1; // c - numarul de numere in intervalul [a,b]

// d - cel mai mic multiplu de 3 din interval

if((t=a % 3, t) != 0)//t-variabila temporara cu restul impartirii lui a la 3.

 d = a - t + 3;

else d = a;

// e - cel mai mare multiplu de 3 din interval

e = b - b % 3;

// f - numarul de multipli de 3 din interval

f = (e - d) / 3 + 1;

// s - suma ceruta

s = (c*(a+b))/2 - f*(d+e);

cout << s;

}

Explicație:

In primul rand, se observa ca pot aduna toate numerele din interval si apoi scadea dublul sumei multiplilor de 3, metoda de lucru care duce la acelasi rezultat.

Reamintim formula pentru suma unei progresii aritmetice:

S_n = \frac{n(a_1 + a_n)}{2}

Avem in vedere 2 progresii aritmetice, (a_n)_{n \geq 1}, cu toate numerele, si (b_n)_{n\geq 1}, cu multiplii de 3, in care:

 a_1 = \textrm{a-ul citit}, b_1 = \textrm{primul multiplu de 3 din interval}\\a_r = 1 = \textrm{ratia progresiei a}\\ b_r = 3 = \textrm{ratia progresiei b}

 d = b_1 = \begin{cases}a,\quad\quad\quad\quad\quad\quad\text{daca } a \in M_3}\\a+3-a\%3,\quad \text{daca } a \notin M_3\end{cases}

Ultimul multiplu de 3 din interval se poate afla daca este scazut din b restul impartirii sale la 3.

 e = b - b \% 3

Numarul total de elemente de la a la b:

 c = b - a + 1

Numarul total de multiplii de 3:

 f = \frac{e - d}{3} + 1

Si in final, sumele:

\textrm{Pentru progresia a: }\\\\S_c = \frac{c\cdot (a+b)}{2}\\\\\textrm{Pentru progresia b:}\\\\ S_f = \frac{f\cdot (d+e)}{2}\\\\\textrm{Acum o scadem pe a 2-a de 2 ori din prima pentru a afla suma ceruta:}\\\\S = S_c - 2S_f\\\\S=\frac{c\cdot (a+b)}{2} - \cancel{2}\cdot \frac{f\cdot (d + e)}{\cancel{2}}\\\\ \boxed{S = \frac{c\cdot (a+b)}{2} - f\cdot (d+e)}

Alte întrebări interesante