Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 03. 12. 2015 22:45 — Editoval koninka (03. 12. 2015 22:48)

koninka
Zelenáč
Příspěvky: 4
Reputace:   
 

Rozklad na součet

Ahoj, potřebovala bych poradit s tímto příkladem,
Rozklad na součet
Na standardním vstupu je zadáno číslo N (1 ≤ N ≤ 40). Vypište na standardní výstup všechny možnosti, jak toto číslo rozložit na součet celých kladných čísel. Každý rozklad musí být uveden na samostatném řádku, sčítanci vyjmenováni od nejmenšího k největšímu a odděleny znaménkem "+". Na pořadí řádků nezáleží.

Například pro N=5 je jeden ze správných výstupů následující:

1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
1+4
2+3
5
Podařilo se mi už naprogramovat velkou část, ale nějak to nejsem schopná dodělat. Předem děkuju za jakoukoli radu. Tady je můj kód, pracujeme s Pascalem:
program rozklad;
var i,N,j,d,u,m,p:integer;
    pole: array [0..40] of integer;
procedure soucet(k,z,cislo:integer);
begin
if z<cislo then
begin
  for i:=z to cislo do
   begin
   pole[k]:=i;
   soucet(k+1,i,cislo-i);
   end;
  end;
  if z=cislo then
   begin
    pole[k]:=z;
    write(pole[1]);
    for j:=2 to k do
     begin
      write('+');
      write(pole[j]);
     end;
      writeln;
   end;
   if cislo=0 then
   begin
   if pole[1]<>N then
   begin
    write(pole[1]);
    for u:=2 to k-1 do
     begin
      write('+');
      write(pole[u]);
     end;
     writeln;
    end;
   end;
end;
begin
readln(N);
if (N>=1) and (N<=40) then
writeln(N);
begin
for m:=1 to (N div 2) do
soucet(1,m,N);
end;

end.

Offline

 

#2 05. 12. 2015 16:26

Eratosthenes
Příspěvky: 3111
Reputace:   140 
 

Re: Rozklad na součet

ahoj ↑ koninka:,

nad kódem jsem moc nepřemýšlel, ale když jsem ho spustil, zjistil jsem, že jediný problém je v tom, že se některý řádek občas zopakuje. Takže nejjednodušší asi bude "zakázat" duplicitní výpisy. Nejlépe tak, že se založí pole stringů, kam se budou vypsané řádky ukládat. Každý nový řádek se nejdřív poskládá do nového stringu, který se nejdřív porovná s tím, co bylo už dříve vypsáno. Pokud se nenajde duplicita, řádek se vypíše a přidá k "porovnávacímu" poli.


Budoucnost patří aluminiu.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson