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
Exemplu:
Intrare
12 3
Ieşire
DA
Explicaţie
12 = 3 + 4 + 5
Răspunsuri la întrebare
Răspuns de
5
O suma de numere naturale consecutive este defapt suma termenilor unei progresii aritmetice cu ratia 1. Ne vom folosi de formula pentru calculul acestei sume:
, unde a1 si an sunt primul, respectiv ultimul termen al progresiei, iar n este numarul de elemente
In cazul nostru S este defapt a(suma finala), iar n este b (numarul de termeni)
Inlocuim:
Am stabilit la inceput ca ratia este r = 1 , deci il putem scrie pe an in functie de a1 conform formulei termenului general al unei progresii aritmetice:
Inlocuim:
[tex]a= \frac{(2a_1+b-1)b}{2}\\ 2a = 2ba_1+b^2-b\\ 2ba_1=2a+b-b^2\\\\ a_1= \frac{2a+b-b^2}{2b} [/tex]
a1 trebuie sa fie numar natural ==> si acea fractie trebuie sa fie numar natural ==> Problema se rezuma la faptul ca 2a + b - b² trebuie sa fie divizibil cu 2b
Codul:
#include <iostream>
using namespace std;
int main()
{
int a, b, aux;
cin>>a>>b;
aux = 2 * a + b - b * b; // Numaratorul fractiei
if(aux > 0 && aux % (2 * b) == 0) //In primul rand trebuie sa fie pozitiv
cout<<"DA";
else
cout<<"NU";
}
//END
Daca nu ai rabdare sa parcurgi toate explicatiile, iti las aici si metoda prin brute-force:
#include <iostream>
using namespace std;
int main()
{
int a, b, s = 0, a1 = 1;
cin>>a>>b;
while(s <= a)
{
s = (2 * a1 + b - 1) * b / 2;
a1++;
}
if(s == a)
cout<<"DA";
else
cout<<"NU";
}
, unde a1 si an sunt primul, respectiv ultimul termen al progresiei, iar n este numarul de elemente
In cazul nostru S este defapt a(suma finala), iar n este b (numarul de termeni)
Inlocuim:
Am stabilit la inceput ca ratia este r = 1 , deci il putem scrie pe an in functie de a1 conform formulei termenului general al unei progresii aritmetice:
Inlocuim:
[tex]a= \frac{(2a_1+b-1)b}{2}\\ 2a = 2ba_1+b^2-b\\ 2ba_1=2a+b-b^2\\\\ a_1= \frac{2a+b-b^2}{2b} [/tex]
a1 trebuie sa fie numar natural ==> si acea fractie trebuie sa fie numar natural ==> Problema se rezuma la faptul ca 2a + b - b² trebuie sa fie divizibil cu 2b
Codul:
#include <iostream>
using namespace std;
int main()
{
int a, b, aux;
cin>>a>>b;
aux = 2 * a + b - b * b; // Numaratorul fractiei
if(aux > 0 && aux % (2 * b) == 0) //In primul rand trebuie sa fie pozitiv
cout<<"DA";
else
cout<<"NU";
}
//END
Daca nu ai rabdare sa parcurgi toate explicatiile, iti las aici si metoda prin brute-force:
#include <iostream>
using namespace std;
int main()
{
int a, b, s = 0, a1 = 1;
cin>>a>>b;
while(s <= a)
{
s = (2 * a1 + b - 1) * b / 2;
a1++;
}
if(s == a)
cout<<"DA";
else
cout<<"NU";
}
pixfarapasta:
nu e bun
Alte întrebări interesante
Limba română,
8 ani în urmă
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Engleza,
9 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă