Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
.anchy. Forumaš(ica)

Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
|
[Vrh] |
|
.anchy. Forumaš(ica)

Pridružen/a: 14. 11. 2007. (20:03:46) Postovi: (1BC)16
Lokacija: Zgb
|
Postano: 12:18 sri, 14. 4. 2010 Naslov: |
|
|
Napisite funkciju koja ce primati barem jedan argument x tipa int. Funkcija treba vratiti broj na koliko razlicitih nacina se broj x moze prikazati kao suma prostih brojeva, neovisno o redoslijedu sumanada. (Dakle, ne razlikujemo rastave 2 + 3 + 5 i 5 + 2 + 3, odnosno, brojimo ih kao jedan.)
ideja mi je da proste brojeve <x spremam u jedan niz,i onda s njima radim rastav x na zbroj:
[code:1]#include <stdio.h>
#include <stdlib.h>
int br=0;
int prosto(int i){
int j;
for(j=2;j<i;j++)
if(i%j==0) return 0;
return 1;
}
int *prosti(int x, int *prost){
int i,n=0;
for(i=2;i<x;i++){
if(prosto(i)){
prost=(int*)realloc(prost,++n*sizeof(int));
prost[br]=i;
br++;
}
}
return prost;
}
int part(int x,int *prost,int zadnji){
int cnt=0,i;
if(x<2) return 0;
if(x=2) return 1;
for(i=0;i<br;i++)
if(zadnji<=prost[i])
cnt+=part(x-prost[i], prost, prost[i]);
return cnt;
}
int main(){
int x, *prost;
scanf("%d",&x);
prosti(x,prost);
printf("%d", part(x,prost,2));
system("pause");
free(prost);
return 0;
}
[/code:1]
za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka?
Napisite funkciju koja ce primati barem jedan argument x tipa int. Funkcija treba vratiti broj na koliko razlicitih nacina se broj x moze prikazati kao suma prostih brojeva, neovisno o redoslijedu sumanada. (Dakle, ne razlikujemo rastave 2 + 3 + 5 i 5 + 2 + 3, odnosno, brojimo ih kao jedan.)
ideja mi je da proste brojeve <x spremam u jedan niz,i onda s njima radim rastav x na zbroj:
Kod: | #include <stdio.h>
#include <stdlib.h>
int br=0;
int prosto(int i){
int j;
for(j=2;j<i;j++)
if(i%j==0) return 0;
return 1;
}
int *prosti(int x, int *prost){
int i,n=0;
for(i=2;i<x;i++){
if(prosto(i)){
prost=(int*)realloc(prost,++n*sizeof(int));
prost[br]=i;
br++;
}
}
return prost;
}
int part(int x,int *prost,int zadnji){
int cnt=0,i;
if(x<2) return 0;
if(x=2) return 1;
for(i=0;i<br;i++)
if(zadnji<=prost[i])
cnt+=part(x-prost[i], prost, prost[i]);
return cnt;
}
int main(){
int x, *prost;
scanf("%d",&x);
prosti(x,prost);
printf("%d", part(x,prost,2));
system("pause");
free(prost);
return 0;
}
|
za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka?
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 13:18 sri, 14. 4. 2010 Naslov: |
|
|
[code:1]... f(..., tip varijabla,...) {
...
varijabla = ...
...
}[/code:1]
Ovaj kod ne mijenja vrijednost varijable s kojom je stvar pozvana, neovisno o tome je l' tip neki "obicni" (npr. [tt]int[/tt]) ili pointerski (npr. [tt]int *[/tt]). Zato i tvoj [tt]realloc()[/tt] alocira memoriju, ali ne preusmjeri pointer [tt]prost[/tt] iz [tt]main()[/tt]-a na tu novu memoriju.
Nije li lakse u rekurziji staviti [tt]static[/tt] varijable (niz prostih brojeva i njegova duljina) koje ce, po potrebi, produljivati niz i dodavati proste u njega?
Ako to ne znas, onda
[code:1] for(i=0;i<br;i++)
if(zadnji<=prost[i])
cnt+=part(x-prost[i], prost, prost[i]);[/code:1]
zamijeni s
[code:1] for(p = 2; p <= zadnji; ++p)
if (prost(p))
cnt += part(x - p, p);[/code:1]
pri cemu je [tt]prost()[/tt] funkcija koja provjerava je li argument prost broj, a [tt]part()[/tt] prima dva argumenta kao i u vjezbama.
Ovo rjesenje je solidno sporije od onoga sa [tt]static[/tt] nizom, ali je i dalje ispravno.
Usput:
[tt]if(x[bg=red][color=white]=[/color][/bg]2) return 1;[/tt]
:ccc:
Kod: | ... f(..., tip varijabla,...) {
...
varijabla = ...
...
} |
Ovaj kod ne mijenja vrijednost varijable s kojom je stvar pozvana, neovisno o tome je l' tip neki "obicni" (npr. int) ili pointerski (npr. int *). Zato i tvoj realloc() alocira memoriju, ali ne preusmjeri pointer prost iz main()-a na tu novu memoriju.
Nije li lakse u rekurziji staviti static varijable (niz prostih brojeva i njegova duljina) koje ce, po potrebi, produljivati niz i dodavati proste u njega?
Ako to ne znas, onda
Kod: | for(i=0;i<br;i++)
if(zadnji<=prost[i])
cnt+=part(x-prost[i], prost, prost[i]); |
zamijeni s
Kod: | for(p = 2; p <= zadnji; ++p)
if (prost(p))
cnt += part(x - p, p); |
pri cemu je prost() funkcija koja provjerava je li argument prost broj, a part() prima dva argumenta kao i u vjezbama.
Ovo rjesenje je solidno sporije od onoga sa static nizom, ali je i dalje ispravno.
Usput:
if(x=2) return 1;
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
pbakic Forumaš(ica)

Pridružen/a: 05. 10. 2009. (17:48:30) Postovi: (143)16
Spol: 
|
Postano: 13:27 sri, 14. 4. 2010 Naslov: |
|
|
Ah, tak mi i treba kad sporo pisem :D sry na extra postu...
A ima par sitnih gresaka al kad se to sredi onda radi:
1) u funkciji prosto treba stavit dodatni uvjet na pocetku if(i==2) return 1;
jer je 2 prost broj (a u petlji bi bio djeljiv s 2 pa bi ispalo da nije)
2) u funkciju "prosti" unosis niz "prost" i zelis ga vratit promijenjenog (jer koristis realloc => dakle trebalo bi unijeti pokazivac na taj niz:
int *prosti(int x, int **prost)
(onda recimo u toj funkciji odma deklarirat neki pomocni niz tipa
int* pom=*prost; pa dalje baratat s njim)
zato i kad se funkcija "prosti" poziva treba unositi &prost umjesto samo prost
isto za funkciju "prosti", trebalo bi u onoj for petlji ic do x ukljuceno (jer sta ako je x prost? (ovisno dal zelis brojat 7=7 kao prikaz pomocu prostih brojeva))
3) u funkciji part pocetne uvjete treba promijeniti (al ne samo = u == kod x=2), npr za svaki prost broj nece brojat njega samog, itd... zato recimo
if(x==0) return 1;
if(x<zadnji) return 0;
radi dobro
Ah, tak mi i treba kad sporo pisem sry na extra postu...
A ima par sitnih gresaka al kad se to sredi onda radi:
1) u funkciji prosto treba stavit dodatni uvjet na pocetku if(i==2) return 1;
jer je 2 prost broj (a u petlji bi bio djeljiv s 2 pa bi ispalo da nije)
2) u funkciju "prosti" unosis niz "prost" i zelis ga vratit promijenjenog (jer koristis realloc => dakle trebalo bi unijeti pokazivac na taj niz:
int *prosti(int x, int **prost)
(onda recimo u toj funkciji odma deklarirat neki pomocni niz tipa
int* pom=*prost; pa dalje baratat s njim)
zato i kad se funkcija "prosti" poziva treba unositi &prost umjesto samo prost
isto za funkciju "prosti", trebalo bi u onoj for petlji ic do x ukljuceno (jer sta ako je x prost? (ovisno dal zelis brojat 7=7 kao prikaz pomocu prostih brojeva))
3) u funkciji part pocetne uvjete treba promijeniti (al ne samo = u == kod x=2), npr za svaki prost broj nece brojat njega samog, itd... zato recimo
if(x==0) return 1;
if(x<zadnji) return 0;
radi dobro
|
|
[Vrh] |
|
Gino Forumaš(ica)

Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
Postano: 13:52 sri, 14. 4. 2010 Naslov: |
|
|
[quote=".anchy."]za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka?[/quote]
ja neznam cemu ti tako sve to kompliciras, i neda mi se gledat kod(i tako je sego to napravio :) )... al ajmo ovako, zapravo treba samo generalizirat [tt]Zadatak 2.5[/tt] iz skripte
krenimo ovako, napisimo prvo rekurziju koja vraca broj nacina na koji mozemo prirodan broj [tt]n[/tt] zapisat kao sumu prirodnih brojeva, ali [tt]1+2[/tt] tretiramo istim zapisom kao [tt]2+1[/tt]...
odmah sam stavio da se ispisuju svi nacini, ako bas hoces, mozes polje alocirat u mainu...
[code:1]#include <stdio.h>
#include <stdlib.h>
int f(int polje[], int n, int broj, int koji){
int i,cnt=0;
if(broj==0){
for(i=0;i<n;i++)
printf("%d ",polje[i]);
printf("\n");
return 1;
}
for(i=koji;i<=broj;i++){
polje[n]=i;
cnt+=f(polje,n+1,broj-i,i);
}
return cnt;
}
int main(){
int polje[20]={0};
int n=10;
printf("%d\n",f(polje,0,n,1));
system("pause");
return 0;
}[/code:1]
sad moras samo malo nesto promijenit, napisat funkciju koja provjerava jel broj prost, i liniju koda [tt]for(i=koji;i<=broj;i++){[/tt] zamjenit sa
[tt]for(i=koji;i<=broj;i++)[bg=blue][color=white]if(prost(i))[/color][/bg]{[/tt] i time ne da si rjesila zadatak, nego i jos vise :D
[quote="pbakic"]Ah, tak mi i treba kad sporo pisem[/quote]
ja sam ocito jos sporiji
.anchy. (napisa): | za svaki broj mi ispiše da ima samo jedan rastav ako nizu zadam duljinu,bez realloca,što će reći da se s reallocom ruši program,a ne razumijem zašto,pa ako može pomoć oko toga i točnosti zadatka? |
ja neznam cemu ti tako sve to kompliciras, i neda mi se gledat kod(i tako je sego to napravio )... al ajmo ovako, zapravo treba samo generalizirat Zadatak 2.5 iz skripte
krenimo ovako, napisimo prvo rekurziju koja vraca broj nacina na koji mozemo prirodan broj n zapisat kao sumu prirodnih brojeva, ali 1+2 tretiramo istim zapisom kao 2+1...
odmah sam stavio da se ispisuju svi nacini, ako bas hoces, mozes polje alocirat u mainu...
Kod: | #include <stdio.h>
#include <stdlib.h>
int f(int polje[], int n, int broj, int koji){
int i,cnt=0;
if(broj==0){
for(i=0;i<n;i++)
printf("%d ",polje[i]);
printf("\n");
return 1;
}
for(i=koji;i<=broj;i++){
polje[n]=i;
cnt+=f(polje,n+1,broj-i,i);
}
return cnt;
}
int main(){
int polje[20]={0};
int n=10;
printf("%d\n",f(polje,0,n,1));
system("pause");
return 0;
} |
sad moras samo malo nesto promijenit, napisat funkciju koja provjerava jel broj prost, i liniju koda for(i=koji;i⇐broj;i++){ zamjenit sa
for(i=koji;i⇐broj;i++)if(prost(i)){ i time ne da si rjesila zadatak, nego i jos vise
pbakic (napisa): | Ah, tak mi i treba kad sporo pisem |
ja sam ocito jos sporiji
_________________ Mario Berljafa
|
|
[Vrh] |
|
|