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!
Răspunsuri la întrebare
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:
Avem in vedere 2 progresii aritmetice, , cu toate numerele, si , cu multiplii de 3, in care:
Ultimul multiplu de 3 din interval se poate afla daca este scazut din b restul impartirii sale la 3.
Numarul total de elemente de la a la b:
Numarul total de multiplii de 3:
Si in final, sumele: