ahojky
potřebuji pomoci s tímto zadáníčkem
Skrytý text:
Napište program, který generuje všechny výrazy s použitím zadaných čísel, jejichž hodnotou je zadaná hodnota.
Na prvním řádku dostane program dvě čísla N a K. Na druhém řádku pak následuje N přirozených čísel.
Program by měl vygenerovat všechny posloupnosti operátorů takové, že když se jednotlivé operátory vloží mezi zadaná čísla, bude hodnota takto vytvořeného výrazu rovna číslu K.
Operátory jsou přípustné pouze tyto: '+', '-', '*' a '/' (celočíselné dělení).
Každý nalezený výraz by měl být na samostatném řádku.
Příklad:
Vstup:
5 5
1 8 2 5 4
Výstup:
1+8+2/5-4
1+8-2/5-4
1+8/2/5+4
1-8*2+5*4
1-8/2/5+4
1*8-2-5+4
1*8-2-5/4
1*8/2+5-4
1*8/2+5/4
1*8/2*5/4
případně dal by se modifikovat tenhle program nějak?
Skrytý text:
{ 09. Binarni operatory,
zadana nejaka cela cisla a cislo X, doplnit mezi ne binarni operatory
+, -, *, div a nic (mezera napr: 1 2=12), aby vysledek byl X }
const
maxn = 10;
pocet_ops = 5;
var
{ vzdy 3 tabulky - 1. zadani, 2. po vyhazeni mezer,
3. po vyhazeni nasobeni a deleni }
cisla : array[1..3, 1..maxn] of integer;
binopy : array[1..3, 1..maxn-1] of char; { binarni operatory }
i, n, x : integer;
hotovo : boolean; { zda bylo nalezeno reseni }
const { seznam operatoru }
ops : array[1..pocet_ops] of char = ( '+', '-', '/', ' ', '*' );
{ vyhodnoti vyraz a porovna ho s pozadovanou hodnotou X }
procedure vyhodnot;
var
j : integer;
pocet2, pocet3 : integer; { velikosti 2. a 3. tabulky, (1. ma n) }
suma : integer; { vysledek }
begin
{ vyhodnot mezery }
pocet2:=0;
for j:=1 to n do
begin
if (j=1) or (binopy[1, j-1]<>' ') then
begin
pocet2:=pocet2+1;
if (j>1) then binopy[2, pocet2-1]:=binopy[1, j-1];
cisla[2, pocet2]:=cisla[1, j];
end else
cisla[2, pocet2]:=cisla[2, pocet2]*10+cisla[1, j];
end;
{ vyhodnot nasobeni a deleni }
pocet3:=0;
for j:=1 to pocet2 do
begin
if (j=1) or ((binopy[2, j-1]<>'*') and (binopy[2, j-1]<>'/')) then
begin
pocet3:=pocet3+1;
if (j>1) then binopy[3, pocet3-1]:=binopy[2, j-1];
cisla[3, pocet3]:=cisla[2, j];
end else
if (binopy[2, j-1] = '*') then cisla[3, pocet3]:=cisla[3, pocet3]*cisla[2, j] else
cisla[3, pocet3]:=cisla[3, pocet3] div cisla[2, j];
end;
{ vyhodnot scitani a odcitani }
suma:=cisla[3, 1];
for j:=2 to pocet3 do { !pozor! od 2 }
begin
if (binopy[3, j-1] = '+') then suma:=suma + cisla[3, j] else
suma:=suma - cisla[3, j];
end;
{ bylo nalezeno reseni? }
if (suma = x) then hotovo:=true;
end;
procedure generuj_binopy(poz : integer);
var
j : integer;
begin
{ je-li vygenerovano N operatoru -> vyhodnot vyraz }
if (poz = n) then vyhodnot
else
for j:=1 to pocet_ops do
if not hotovo then
{ abych si neprepsal nalezene reseni (uz nemusim nic delat) }
begin
binopy[1, poz]:=ops[j];
generuj_binopy(poz+1);
end;
end;
begin
read(n, x);
for i:=1 to n do cisla[1, i]:=i; { nejaky vstup, treba tento }
hotovo:=false; { jeste nebylo nalezeno reseni }
generuj_binopy(1); { vygeneruj operatory a hledej reseni }
{ vypis reseni, pokud existuje }
if not hotovo then writeln('Reseni neexistuje.') else
begin
write(cisla[1, 1]);
for i:=2 to n do write(' ', binopy[1, i-1], ' ', cisla[1, i]);
writeln(' = ', X);
end;
end.
moc moc děkuju :)