👤

Cerinţă
Se dau 2 numere naturale, a şi b. Să se determine dacă a se poate scrie că suma de b numere naturale consecutive.
Date de intrare
Programul citeşte de la tastatură cele 2 numere a şi b.
Date de ieşire
Programul va afişa pe ecran numărul mesajul DA dacă a se poate scrie că suma de b numere naturale, iar NU în caz contrar.
Restricţii şi precizări
1 ≤ a ≤ 100.000.000
1 ≤ b ≤ 25.000
dau 20 de pct
va rooooooog
In C++


Răspuns :

int a,b;
cin >> a >> b;
if(a%b == 0){
cout << "Da";
}else{cout <<"Nu";}

/*Ca sa se poata scrie trebuie sa fie divizibile deoarece inmultirea reprezinta adunari repetitive*/
Bun pai, folosim putin mate: 

ca un nr a sa se scrie ca suma de b nr naturale consecutive inseamna ca:

Exista un k astfel incat:

(k+1) + (k+2) + (k+3) + ... + (k+b) = a

Acum, observam ca avem exact b numere consecutive si toate sunt mai mari decat k, asa ca putem desface parantezele si scoatem cei b de k in fata:

b*k + (1+2+3+...+b) = a

Acum, stim ca:

1+2+3+...+b = [tex] \frac{b(b+1)}{2} [/tex]

Deci avem:


[tex]b*k+\frac{b(b+1)}{2} = a [/tex]

Adica:

[tex]b*k = a - \frac{b(b+1)}{2}[/tex]

Adica:

[tex]k = \frac{a - \frac{b(b+1)}{2}}{b}[/tex]

Ala ar fi k-ul tau, dar ai o singura problema, e posibil sa nu iti dea nr intreg. Daca nu iti da k nr intreg atunci evident nu poate a sa fie scris ca suma de nr naturale consecutive. 

Asa ca sfatul meu este sa iti declari si a, si b, si k ca si nr reale, adica float, nu int, si la sfarsit, dupa ce ai aflat k, sa verifici daca k este nr intreg sau nu. Si asta o faci asa:

if (k == (int)k)

Treaba aia cu int se numeste cast si se face la facultate tehnic, practic e ceva extrem de simplu, ii "soptesti" programului in c++ ca vrei sa se "prefaca" ca k e int, nu float, pentru calculul ala, DOAR pt calculul ala.