[ Cruonit @ 03.02.2003. 09:01 ] @
Bili neko znao rjesiti ovaj zadatak u pascalu:

Unosimo 7 brojeva.Prvi broj je cilj.Ostalih 6 brojeva su proizvoljni brojevi i mogu se
sabirati, oduzimati,djeliti, mnoziti medusobno da se dobije ciljani broj.Svaki od 6 brojeva se moze samo jednom koristiti. Moras napisati program koji aranzira te brojeve tako da daju ciljani broj koristeci: +,-,*,/,( ).

Primjer:

Cilj=235

8
7
5
25
4
3


(25) + (((8*7*5)/4)*3) = 235
[ Riste Pejov @ 03.02.2003. 09:13 ] @
Dali se moraju iskoristiti svi 6 brojevi da bi doslo do ciljneg?
ili je moguce da u slucaju kad samo dva ispunjavaju uslov, ta dva da budu resenje.
[ Cruonit @ 03.02.2003. 19:26 ] @
ne... treba svih 6 koristiti !
[ Cruonit @ 04.02.2003. 08:47 ] @
Rjesio sam ovaj "djelimicno" ali ne i pravo ideja je bila da napraavim program koji generira sve moguce varijacije sa tih 6 brojeva i expotuje ga u .pas file medutim to je dosta primitivno rjesene i ne moze se smatrati rjesenjom tog zadatka.... Zato bi vas zamalio ako mozete da ga rjesite (ps. ovo je olimpijski zadatak)
[ Riste Pejov @ 04.02.2003. 08:54 ] @
Code:

function find_sum(nums array[1..6] of int;
                         used array[1..6] of bool;
                         cilj,sum,level int;
                         var formula string):string;
var
    k,sum:int;
    finish:bool;
begin
for k:=1 to 6 do
    begin
    if not(used[k]) then
            begin
               used[k]:=true;    
               for operation:=1 to 4 do
                    begin
                    case operation of
                           1:begin
                              sum:=sum+nums[k];
                              formula:='('+formula+'+'+nums[k]+')';
                              end;
                           2:begin
                              sum:=sum-nums[k];
                              formula:='('+formula+'-'+nums[k]+')';
                              end;
                           3:begin
                              sum:=sum*nums[k];
                              formula:='('+formula+'*'+nums[k]+')';
                              end;
                           4:begin
                              sum:=sum/nums[k];
                              formula:='('+formula+'/'+nums[k]+')';
                              end;
                         end;
                    inc(level);
                    if(level<6)
                    formula:=find_sum(nums,used,cilj,sum,level,formula)
                    else if (sum=cilj)
                           writeln(formula);

                    end; //operation end
            end; //if not used end
     end;//for end
     
end;

//glavni program
// inicijalizacija array-a iskoriscenosti
for m:=1 to 6 do
    used[m]:=false;

// glavni loop
for m:=1 to 6 do
    begin
    level:=1;
    sum:=nums[m];
    used[m]:=true;
    test:=find_sum(nums,used,cilj,sum,level,formula);
    end;    


Kao sto si vec video, moras prvo sam podeliti niz na promenljivu zvanu cilj, i ostatak niza sa 6 clanova.
Ideja je da u glavnom loop-u, startujes funkciju po jednom za svakog clana niza, i onda funkcija rekurzivno da preleti preko celog niza i pokusa sve moguce kombinacije. Malo je apsurdno resenje da jednostavno isprinta formulu usred rekurzije, ali to mozes modifikovati da povratni parametar iz funkcije bude prava formula. Uglavnom ovo bi trebalo uz malo modifikacije da radi. (jedino mozda nisam napisao pravu pascal deklaraciju fukcije)