|
[ miniplazma @ 16.05.2010. 13:07 ] @
| Trebam da napisem program za generisanje svih varijacija bez ponavljanja k-te klase od n elemenata.Znam kako da uradim varijacije sa ponavljanjem,treba li u tom kodu nesto da promjenim ili da pisem novi program.Ako trebam da pisem novi mogu li neke ideje jer bas ne znam kako.Moze i rekurzivno i nerekurzivno
Code: program varijacije_sa_pon;
type niz=array[1..10] of integer;
var
x,y,z:niz;
nn,kk,i,br:integer;
procedure stampaniza(n:integer;a:niz);
var
i:integer;
begin
for i:=1 to n do
write(a[i]);
writeln;
end;
function jednaki (n:integer;x,y:niz):boolean;
begin
jednaki:=true;
for i:=1 to n do
if x[i]<>y[i] then
begin
jednaki:=false;
break;
end;
end;
procedure sledeca_var(n,k:integer;var x:niz);
var
i,j:integer;
begin
i:=k;
while ((x[i]=n)and(i>0)) do
i:=i-1;
x[i]:=x[i]+1;
for j:=i+1 to n do
x[j]:=1;
end;
begin
write('n=');
readln(nn);
write('k=');
readln(kk);
br:=1;
for i:=1 to kk do
begin
x[i]:=1;
y[i]:=nn;
end;
while not jednaki(kk,x,y) do
begin
stampaniza(kk,x);
sledeca_var(nn,kk,x);
br:=br+1;
end;
stampaniza(kk,x);
writeln('Broj varijacija sa ponavljanjem: ',br);
readln;
end.
|
[ salaczr @ 17.05.2010. 10:03 ] @
Code: write('n=');
readln(nn);
write('k=');
readln(kk);
br:=1;
for i:=1 to kk do
begin
x[i]:=1;
y[i]:=nn;
end;
Ovo parce koda ce popuniti niz Y sa samo jednom vrednoscu nn, a niz X sa jedinicama. Mislim da to i nisi hteo. Opisi malo bolje problem da bi mogli da ti pomognemo.
[ miniplazma @ 17.05.2010. 11:06 ] @
ovo je kod za varijacije sa ponavljanjem
ako je n=3 a k=2 prvi niz x popunjava sa 2 jedinice(prva moguca varijacija sa ponavljanjem),niz y sa dvije 3(poslednja moguca varijacija).dok su razliciti radi sledece:
stampan niz x
11
-zatim povecava zadnju cifru dok ne bude jednaka n,tj 3.bice:
12
13
-kada je zadnja cifra jednaka 3 ,pomjera se indeks niza mjesto unazad i svi clanovi niza posl njega se postavljaju na jedan.i ponovo se zadnji clan povecava dok ne bude jednak n
21
22
23
indeks se pomjeri na prethodni,i povecava se do n
31
32
33
_____________________
sad za varijacije bez ponavljanja ,npr n=4 ,k=3 bi trebalo da popuni x sa 123 a y sa 432
i trebalo bi da stampa:
123
124
132
134
213
214
321
324
412
413
423
431
432
da radim sa skupovima,pa da redom dodajem u skup sve brojeve koji se javljaju prije broja koji mijenjam i da prvi koji nije u skupu stavim na tu poziciju? ili nesto drugo?
[ miniplazma @ 17.05.2010. 22:35 ] @
Ovo je neki moj pokušaj,ali ne radi prog kako treba,preskače neke varijacije
Code: program varijacije_bez_ponavljanja;
type niz=array[1..10] of integer;
broj=1..40;
skup=set of broj;
var
x,y,z:niz;
nn,kk,i,br,q:integer;
procedure stampaniza(n:integer;a:niz);
var
i:integer;
begin
for i:=1 to n do
write(a[i]);
writeln;
end;
function jednaki(a,b:niz;n:integer):boolean;
{vraca true ako su nizovi a i b duzine n jednaki}
var
i:integer;
begin
jednaki:=true;
for i:=1 to n do
if a[i]<>b[i] then
begin
jednaki:=false;
break;
end;
end;
procedure sledeca_var(n,k:integer;var x:niz);
var
i,j:integer;
s:skup;
begin
i:=k;
while ((x[i]=n) and(i>1)) do
i:=i-1;
s:=[];
for j:=1 to i-1 do
s:=s+[x[j]];
while (not(x[i] in s) and (x[i]<n)) do
x[i]:=x[i]+1;
while ((x[i] in s)and(i>1)) do
i:=i-1;
for j:=i+1 to k do
x[j]:=j;
end;
begin
write('n= ');
readln(nn);
write('k= ');
readln(kk);
br:=0;
for i:=1 to kk do
x[i]:=i;
for i:=1 to kk do
y[i]:=nn+1-i;
while not jednaki(x,y,kk) do
begin
stampaniza(kk,x);
sledeca_var(nn,kk,x);
end;
stampaniza(kk,x);
readln;
end.
[ Picsel @ 18.05.2010. 21:33 ] @
Code: type nizInt=array[1..10] of integer;
type nizBool=array[1..10] of boolean;
var ukupanbroj,nn,kk:integer;
niz1:nizBool;
niz2:nizInt;
procedure varijacije(n,k,trenutnacifra:integer; uvarijaciji:nizBool; varijacija:nizInt);
var i:integer;
begin
if trenutnacifra>k
then begin
{ispis trenutne varijacije}
ukupanbroj:=ukupanbroj+1;
for i:=1 to k do
write(varijacija[i]);
writeln;
end
else begin
for i:=1 to n do
if not uvarijaciji[i]
then begin
uvarijaciji[i]:=true;
varijacija[trenutnacifra]:=i;
varijacije(n,k,trenutnacifra+1,uvarijaciji,varijacija);
uvarijaciji[i]:=false;
end;
end;
end;
begin
readln(nn,kk);
varijacije(nn,kk,1,niz1,niz2);
writeln('Ukupan broj varijacija: ',ukupanbroj);
readln;
end.
Ovako nesto? Procedura pokusava da u varijaciju doda neki broj od 1 do n koji vec nije stavljen u do sad generisan deo varijacije, i tako za svaku cifru. Kad napravi varijaciju, ispise.
[ miniplazma @ 18.05.2010. 21:40 ] @
da :)
hvala puno
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|