Ciao Ervilla
Il problema è un problema di calcolo delle 'combinazioni con ripetizione', se cerchi questa parola in internet troverai un mucchio di informazioni. Anche se la tua richiesta di escludere gli zeri cambia un pochino le cose.
Comunque il tutto si risolve in poche righe.
Questa è la versione che calcola anche gli zeri:
void Scomponi(string s, int somma, int addendi)
{
for (int i = 0; i <= somma; ++i)
{
string z = s + " " + (somma - i);
if (addendi == 1)
{
Print(z);
return;
}
Scomponi(z, i, addendi - 1);
}
}
richiamandola con 4 e 2 generera:
4 0
3 1
2 2
1 3
0 4
Questa è la versione che esclude gli zeri (cambia solo un '+1'):
void Scomponi(string s, int somma, int addendi)
{
for (int i = 0; i <= somma; ++i)
{
string z = s + " " + (somma - i + 1);
if (addendi == 1)
{
Print(z);
return;
}
Scomponi(z, i, addendi - 1);
}
}
Va richiamata sottraendo alla somma il numero di addendi.
Ad esempio:
somma = 10;
addendi = 3;
somma = somma - addendi
Scomponi("", somma, addendi);
Usando 4 e 2 generera:
3 1
2 2
1 3
Usando 5 e 3 genera:
3 1 1
2 2 1
2 1 2
1 3 1
1 2 2
1 1 3
Usando 7 e 6 genera:
2 1 1 1 1 1
1 2 1 1 1 1
1 1 2 1 1 1
1 1 1 2 1 1
1 1 1 1 2 1
1 1 1 1 1 2
Usando 10 e 10 genera:
1 1 1 1 1 1 1 1 1 1
Queste informazioni dovrebbero bastarti a scriverti il programma, se non sei in grado di farlo posso darti una mano.
Una curiosità a cosa ti serve un programma del genere?