Newsgroup: it.comp.lang.pascal
Titolo: scomposizione degli addendi

Salve,
vorrei tentare questo esercizio in Pascal, dato un certo numero x (ad
esempio 13) , ottenerne tutti i possibili addendi.. quindi per 13:
13=
12+1
10+3
9+4
8+5
7+6
6+7
5+8
anche con piů di due addendi:
13=
11+1+1
7+3+3
Qualche suggerimento ? Grazie mille. E' solo un anno che studio il Pascal.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Qualche suggerimento ? Grazie mille. E' solo un anno che studio il Pascal.
puoi utilizzare dei contatori, ad esempio, per scomporre in due addendi:
for k:=1 to num-1 do
  writeln(num-k,' + ',k);
oppure
for k:=1 to (num div 2) do
  for j:=1 to (num div 2) do
    writeln(num-k-j,'+',k,'+',j)
naturalmente e' da ottimizzare, cercando di ridurre le ripetizioni, ma in
due minuti mi e' venuto questo
http://www.Turbo-Pascal.cjb.net
e-mail dgruma@NOPUBBLICITA'
tin.it
 (Da togliere NOPUBBLICITA' se vuoi
rispondermi in privato)
UIN icq 117743990

Probabilmente mancheranno pezzi e ci sarà qualche errore, ma è codice
scritto a botto... quindi bisogna accontentarsi ^^
Ora... quese poch righe "teoricamente" ti restituiscono la somma degli n
numeri che sommati danno k...
//a+b+c+...n=k
//tutti gli n  numeri che sommati ritornano il valore k
var num:array [1..256] of integer;
    i,n,m,l,k:integer;
procedure stampa;
var t:integer;
begin
for t:=1 to n do
  write(num[t],' + ');
end;
begin
write('Scrivi gli n valori: ');
readln(n);
write('Scrivi la loro somma: ');
readln(k);
i:=1;
while i<=n do
  begin
  num[i]:=1;
  if i=n then
    num[i]:=k-n+1;
  inc(i);
  end;
stampa;
writeln;
stampa;
for m:=2 to ((k div n)+1) do
  begin
  for l:=1 to (n-1) do
    begin
    num[n-l]:=m;
    dec(num[n]);
    stampa;
    writeln;
    if num[n]=1 then break;
    end;
  end;
  readln;
end.

Ok ecco il programma funzionante... aggiustato in 5 minuti quindi non č
ottimizzato... e sarebe da aggiustare la procedura stampa.
Se ti serve una mano chiedi pure
var num:array [1..256] of integer;
    i,n,m,l,k:integer;
procedure stampa;
var t:integer;
begin
for t:=1 to n do
  write(num[t],' + ');
end;
begin
write('Scrivi gli n valori: ');
readln(n);
write('Scrivi la loro somma: ');
readln(k);
i:=1;
while i<=n do
  begin
  num[i]:=1;
  if i=n then
    num[i]:=k-n+1;
  inc(i);
  end;
stampa;
writeln;
stampa;
for m:=2 to ((k div n)+2) do


Ok giuro che è l'ultimo post... ma appena lo mando mi vengono in mente delle
migliorie...
var num:array [1..256] of integer;
    i,n,m,l,k:integer;
procedure stampa;
var t:integer;
begin
for t:=1 to n-1 do
  write(num[t],' + ');
write(num[n],' = ',k);
end;
begin
write('Scrivi gli n valori: ');
readln(n);
write('Scrivi la loro somma: ');
readln(k);
i:=1;
for i:=1 to n-1 do
  num[i]:=1;
num[n]:=k-n+1;
stampa;
for m:=2 to ((k div n)+2) do
  begin
  for l:=1 to (n-1) do
    begin
    num[n-l]:=m;
    dec(num[n]);
    writeln;
    stampa;


 i,n,m,l,k:integer;
Il programma funziona bene. L'unica cosa che sto cercando di risolvere è se
il numero di addendi che scegliamo è impossibile per la somma che digitiamo,
si ottengono risultati sbagliati.. tipo:
n ( valori) = 5
k (somma) = 9
Per 9, il numero di valori deve essere 2.


unico problema è che è scritto da cani... e mancano dei pezzi... cioè non
mostra tutti gli addendi possibili... tipo, se tu gli dai
n=3
k=13
ti da una serie di valori, ma ralascia quelli con differenza maggiore di
1... mi spiego meglio... nel ciclo toglie sempre uno al valore di num[n] e
aggiunge uno a un valore precedente del'array; quindi la serie 1+5+7 non
appare... me ne sono reso conto questa notte prima di addormentarmi ^^ si
sa, il sonno porta consiglio... quindi dovresti inserire un ulteriore ciclo
per inserire tutte queste somme non incluse nel mio codice...