Informatică, întrebare adresată de bencheacatalin, 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
Exemplu:
Intrare
12 3
Ieşire
DA
Explicaţie
12 = 3 + 4 + 5

Răspunsuri la întrebare

Răspuns de Razzvy
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:

S= \frac{(a_1+a_n)n}{2} , 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:

a = \frac{(a_1+a_n)b}{2}

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:

a_n=a_1+(n-1)r=a_1+n-1=a_1+b-1

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