Informatică, întrebare adresată de Utilizator anonim, 9 ani în urmă

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ăspunsuri la întrebare

Răspuns de VancaRares
1
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*/

Seckar: Nu cred ca ai inteles cerinta. a trebuie sa se poata scrie ca suma de b numere consecutive intre ele.
Seckar: Adica sa existe un k a.i. (k+1) + (k+2) + (k+3) + ... + (k+b) = a
Utilizator anonim: mi-a dat 100 de puncta...era buna
NuPotSaStiuTot: ai furat 100 de punta!!!!!
Seckar: Daca ti-a dat 100 puncte bravo tie, doar ca acea rezolvare era gresita.
Utilizator anonim: site-ul zice ca e buna
rossetta: Dacă a = 3 și b = 2 atunci există soluția 1 + 2 = 3. Dar cum a % b = 3 % 2 = 1, programul va spune că nu există soluție. În plus, programul nu verifică dacă primul termen este număr pozitiv sau negativ.
Răspuns de Seckar
2
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 =  \frac{b(b+1)}{2}

Deci avem:


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

Adica:

b*k = a - \frac{b(b+1)}{2}

Adica:

k = \frac{a - \frac{b(b+1)}{2}}{b}

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.  


rossetta: În loc să folosim numere reale și type cast este mai simplu (și de preferat) să folosim operatorul %.
Seckar: Faina observatie!
Seckar: Desi prefer sa mai strecor si cate un concept nou pe unde pot ca sa mai invete lumea ceva :)
Alte întrebări interesante