Quelques explications avant de commencer...
RS et RP signifient RéférenceSomme et RéférenceProduit qui sont les somme et produit des valeurs de départ. En effet pour m'assurer qu'il n'y avait pas de "doubles", je calcule la somme (S) et le produit (P) de chaque combinaison possible et n'affiche le résultat que si RS=S et RP=P... Ce n'est pas une méthode infaillible (si tu rentres plusieurs fois la même valeur) mais dans la plupart des cas ça devrait convenir.
program Ziko;
const Nmax=5; // les résultats ne sont pas affichables pour Nmax>5
type Table=array[1..Nmax] of integer;
procedure Demander(var T:Table;var RS,RP:real;var N:integer);
var i,j:integer;
begin
write('Combien de nombres a entrer : ');
readln(N);
if N>Nmax then Demander(T,RS,RP,N)
else begin
RS:=0; RP:=1;
for i:=1 to N do
begin
write('Nombre ',i,' : ');
readln(j);
RS:=RS+real(j);
RP:=RP*real(j);
T[i]:=j;
end;
writeln;
end;
end;
procedure Afficher(var T,U:Table;RS,RP,S,P:real;M,N:integer);
var i,j:integer;
begin
if M=0 then begin
if (RS=S) and (RP=P)
then begin
for i:=1 to N do
write(U[i]:4,' ');
writeln;
end
end
else begin
for i:=1 to N do
begin
j:=T[i];
U[N-M+1]:=j; // Pour afficher "dans l'ordre"
Afficher(T,U,RS,RP,S+real(j),P*real(j),M-1,N);
end;
end;
end;
var T,U:Table;
RS,RP:real;
N:integer;
begin
Demander(T,RS,RP,N);
Afficher(T,U,RS,RP,0,1,N,N);
writeln; write('Fin du programme. Appuyer sur Entree'); readln;
end.Remarque : Le nombre de lignes à l'affichage est N!
La confiance n'exclut pas le contrôle