Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Dick Long Forumaš(ica)


Pridružen/a: 10. 05. 2006. (13:50:57) Postovi: (22)16
Spol: 
Lokacija: Zagreb
|
Postano: 18:12 ned, 9. 9. 2007 Naslov: Rastav broja na pribrojnike |
|
|
Zadan je prirodni broj n. Nadite na koliko se razliˇcitih naˇcina broj n moˇze prikazati kao
zbroj pribrojnika (koji su, takoder, prirodni brojevi), uz uvjete da u zbroju bude najviˇse
12 pribrojnika i da je razlika susjednih pribrojnika najviˇse 5. Poredak pribrojnika u zbroju
nije bitan, tj. moˇzete smatrati da pribrojnici ne padaju (ili ne rastu). Problem rijeˇsite
rekurzivnom funkcijom. Obavezno napiˇsite kako izgleda poziv te funkcije za zadani n.
Napomena: Funkcija, uz argument n, smije primati i dodatne argumente. Nije dozvoljeno
koriˇstenje polja, lista, te globalnih i static varijabli.
to je zadatak iz 1. kolokvija...:)
i ne znam ga rijesit...jel ima koja dobra dusa..:)
Zadan je prirodni broj n. Nadite na koliko se razliˇcitih naˇcina broj n moˇze prikazati kao
zbroj pribrojnika (koji su, takoder, prirodni brojevi), uz uvjete da u zbroju bude najviˇse
12 pribrojnika i da je razlika susjednih pribrojnika najviˇse 5. Poredak pribrojnika u zbroju
nije bitan, tj. moˇzete smatrati da pribrojnici ne padaju (ili ne rastu). Problem rijeˇsite
rekurzivnom funkcijom. Obavezno napiˇsite kako izgleda poziv te funkcije za zadani n.
Napomena: Funkcija, uz argument n, smije primati i dodatne argumente. Nije dozvoljeno
koriˇstenje polja, lista, te globalnih i static varijabli.
to je zadatak iz 1. kolokvija...
i ne znam ga rijesit...jel ima koja dobra dusa..
|
|
[Vrh] |
|
Dick Long Forumaš(ica)


Pridružen/a: 10. 05. 2006. (13:50:57) Postovi: (22)16
Spol: 
Lokacija: Zagreb
|
|
[Vrh] |
|
Dick Long Forumaš(ica)


Pridružen/a: 10. 05. 2006. (13:50:57) Postovi: (22)16
Spol: 
Lokacija: Zagreb
|
Postano: 21:50 ned, 9. 9. 2007 Naslov: |
|
|
#include<stdio.h>
#include <math.h>
int f(int n,int k, int z){
int a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,s1=0,i;
if (n<0) return (0);
if (n==0) return (1);
if (k==0) return (0);
if (z>0) {
a1=f(n-z,k-1,z);
if(z>1)a2=f(n-z+1,k-1,z-1);
if(z>2)a3=f(n-z+2,k-1,z-2);
if(z>3)a4=f(n-z+3,k-1,z-3);
if(z>4)a5=f(n-z+4,k-1,z-4);
if(z>5)a6=f(n-z+5,k-1,z-5);
return (a1+a2+a3+a4+a5+a6);
}
if (z=-1){
for(i=1;i<=n;i++){
s1+=f(n-i,k-1,i);
}
return s1;
}
}
int main(){
int n,k;
scanf("%d",&n);
k=f(n,12,-1);
printf("%d",k);
scanf("%%");
return 0;
}
eto...fino i radi..:)
vedrane svaka cast...(bivsi asistent iz rp1)
#include<stdio.h>
#include <math.h>
int f(int n,int k, int z){
int a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,s1=0,i;
if (n<0) return (0);
if (n==0) return (1);
if (k==0) return (0);
if (z>0) {
a1=f(n-z,k-1,z);
if(z>1)a2=f(n-z+1,k-1,z-1);
if(z>2)a3=f(n-z+2,k-1,z-2);
if(z>3)a4=f(n-z+3,k-1,z-3);
if(z>4)a5=f(n-z+4,k-1,z-4);
if(z>5)a6=f(n-z+5,k-1,z-5);
return (a1+a2+a3+a4+a5+a6);
}
if (z=-1){
for(i=1;i<=n;i++){
s1+=f(n-i,k-1,i);
}
return s1;
}
}
int main(){
int n,k;
scanf("%d",&n);
k=f(n,12,-1);
printf("%d",k);
scanf("%%");
return 0;
}
eto...fino i radi..
vedrane svaka cast...(bivsi asistent iz rp1)
|
|
[Vrh] |
|
DarkOne™24/7® Forumaš(ica)


Pridružen/a: 22. 11. 2004. (05:46:52) Postovi: (A7)16
Lokacija: zg
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
|
[Vrh] |
|
Nori Forumaš(ica)

Pridružen/a: 01. 10. 2006. (18:41:07) Postovi: (E5)16
Spol: 
|
Postano: 10:20 sri, 30. 4. 2008 Naslov: |
|
|
Nasa funkcija izgleda ovako: int f(int n,int k, int z) gdje je n broj koji trebamo rastaviti na max k pribrojnika,a z nam je zadnji pribrojnik koji smo dodali (u postupku ih zapravo oduzimamo, pa gledamo jesmo li dosli do 0). Na samom pocetku, zadnji pribrojnik nam je nedefiniran, pa ga i postavimo na neku nemogucu vrijednost, npr. -1. U tom prvom krugu, moguci pribrojnici nam mogu biti svi od 1 do n, pa zato i imamo tu petlju for(i=1;i<=n;i++) s1+=f(n-i,k-1,i);
U slucaju da smo vec oduzeli neki 'potencijalni' pribrojnik, sljedeci pribrojnici nam mogu biti u rangu [z,z-5] (uvjet zadatka). Svaki put kad pozivamo funkciju,mijenjamo argumente funkcije i to tako da n-u oduzmemo potencijalni pribrojnik, k smanjimo za 1 (jer smo upravo dodali jedan pribrojnik), a na 3.mjesto stavimo zadnji pribrojnik koji smo stavili).
Pocetnu uvjeti rekurzije su: ako smo oduzeli previse (tj. n se ne moze prikazati kao suma tih pribrojnika), to nije dobar nacin, pa rekurzija vraca 0. Ako smo prekoracili broj pribrojnika (to znaci da nam se k spustio na 0), to isto nije dobro, pa rekurzija vraca 0. I ono sto zapravo zelimo, ako je k dobar, i n=0, sto znaci da se moze prikazati kao suma potencijalnih pribrojnika, rekurzija vrati 1.
Jel jasnije?!
Nasa funkcija izgleda ovako: int f(int n,int k, int z) gdje je n broj koji trebamo rastaviti na max k pribrojnika,a z nam je zadnji pribrojnik koji smo dodali (u postupku ih zapravo oduzimamo, pa gledamo jesmo li dosli do 0). Na samom pocetku, zadnji pribrojnik nam je nedefiniran, pa ga i postavimo na neku nemogucu vrijednost, npr. -1. U tom prvom krugu, moguci pribrojnici nam mogu biti svi od 1 do n, pa zato i imamo tu petlju for(i=1;i⇐n;i++) s1+=f(n-i,k-1,i);
U slucaju da smo vec oduzeli neki 'potencijalni' pribrojnik, sljedeci pribrojnici nam mogu biti u rangu [z,z-5] (uvjet zadatka). Svaki put kad pozivamo funkciju,mijenjamo argumente funkcije i to tako da n-u oduzmemo potencijalni pribrojnik, k smanjimo za 1 (jer smo upravo dodali jedan pribrojnik), a na 3.mjesto stavimo zadnji pribrojnik koji smo stavili).
Pocetnu uvjeti rekurzije su: ako smo oduzeli previse (tj. n se ne moze prikazati kao suma tih pribrojnika), to nije dobar nacin, pa rekurzija vraca 0. Ako smo prekoracili broj pribrojnika (to znaci da nam se k spustio na 0), to isto nije dobro, pa rekurzija vraca 0. I ono sto zapravo zelimo, ako je k dobar, i n=0, sto znaci da se moze prikazati kao suma potencijalnih pribrojnika, rekurzija vrati 1.
Jel jasnije?!
_________________ Meni mama neda da.... Pričam sa dječacima... meni mama neda to-A što?-Jer kaže da je opasno!
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
|
[Vrh] |
|
|