Se considera un numar natural n nenul. Sa se elaboreye un program care sa afiseze si sa contorizeze toate modalitatile de a scrie acest numar ca suma de minim doua numere intregi consecutive. De exemplu pentru n´6 veti obtine 3 modalitati: 1+2+3, 0+1+2+3, -5-4-3-2-1+0+1+2+3+4+5+6.
Fisierul de iesire sume.out va contine pe prima linie numarul k de modalitati de a scrie numarul ca suma de numere intregi consecutive, iar pe urmatoarele k linii cate doua numere intregi n, s, separate prin spatiu, reprezentind, respectiv, numarul de termeni si primul termen din suma corespunzatoare liniei.
Mai jos e varianta mea. Exista ceva mai eficient?
#include <fstream.h>
int main()
{
int T[10000], i, j, suma, k=0, n, vec=0, nr;
cout<<"n="; cin>>n;
for (i=-n; i<n; i++)
{
for (j=i, suma=0, nr=0; suma<n; j++)
{
suma+=j;
nr++;
}
if (suma==n)
{
k++;
T[vec]=nr;
vec++;
T[vec]=i;
vec++;
}
}
ofstream sume("sume.out");
sume<<k<<"\n";
for (i=0; i<vec; i++)
{
sume<<T[i]<<" ";
i++;
sume<<T[i]<<"\n";
}
sume.close();
return 0;
}
Răspunsuri la întrebare
Răspuns de
2
Prefer varianta asta:
#include <iostream>
using namespace std;
int x[20000], v[1000][2], n, nr;
void afis()
{
cout << nr << '\n';
for(int i=1; i<=nr; i++)
cout << v[i][0] << ' ' << v[i][1] << '\n';
}
void afis(int k)
{
nr++;
v[nr][0] = k;
v[nr][1] = x[1];
}
int valid(int k)
{
int suma = 0;
for(int i=1; i<=k; i++) suma += x[i];
if(suma == n) return 1;
return 0;
}
void bkt(int pas)
{
for(int i=1-n; i<=n; i++) {
x[pas] = i;
if( (pas == 1) || (x[pas] == x[pas-1] + 1) ) {
if(valid(pas) && pas != 1) afis(pas);
else bkt(pas+1);
}
}
}
int main()
{
cin >> n;
bkt(1);
afis();
return 0;
}
#include <iostream>
using namespace std;
int x[20000], v[1000][2], n, nr;
void afis()
{
cout << nr << '\n';
for(int i=1; i<=nr; i++)
cout << v[i][0] << ' ' << v[i][1] << '\n';
}
void afis(int k)
{
nr++;
v[nr][0] = k;
v[nr][1] = x[1];
}
int valid(int k)
{
int suma = 0;
for(int i=1; i<=k; i++) suma += x[i];
if(suma == n) return 1;
return 0;
}
void bkt(int pas)
{
for(int i=1-n; i<=n; i++) {
x[pas] = i;
if( (pas == 1) || (x[pas] == x[pas-1] + 1) ) {
if(valid(pas) && pas != 1) afis(pas);
else bkt(pas+1);
}
}
}
int main()
{
cin >> n;
bkt(1);
afis();
return 0;
}
AntiEaglesDavids:
O idee mai buna ar fi totusi cu arbori indexati binari. Cred ca ar merge si cu un deque daca nu ma insel...
Alte întrebări interesante
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
8 ani în urmă
Matematică,
9 ani în urmă
Germana,
9 ani în urmă
Matematică,
9 ani în urmă
Engleza,
9 ani în urmă