| 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] | 
		 | 
	
	
		 |