•k_ounu_eddy
|
 |
« Răspunde #25 : Decembrie 14, 2008, 14:56:49 » |
|
Bool in gcc nu ocupa doar 1 bit?
|
|
|
Memorat
|
|
|
|
•wefgef
|
 |
« Răspunde #26 : Decembrie 14, 2008, 14:58:49 » |
|
Nu, ocupa 8. Poti sa vezi dimensiunea unui tip de date cu sizeof(tip).
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
•k_ounu_eddy
|
 |
« Răspunde #27 : Decembrie 14, 2008, 15:34:14 » |
|
Nu reusesc sa imi dau seama de ce iau SIGSEGV pe sursa asta(primesc doar 20 p pe primele doua teste): #include<stdio.h> #include<string.h>
int n,cnt=0; char *Prime; //Prime[i]==1 => Prime[i] nu e prim //am folosit optimizarile: //nu am luat in considerare numerele pare //in marcarea fiecarui multiplu am pornit de la i*i //am folosit si optimizari pe biti
void pregateste() {FILE *pin=fopen("ciur.in","r"); fscanf(pin,"%d",&n); Prime=new char[n/16+10]; memset(Prime,0,sizeof(Prime)*(n/16+1)); fclose(pin);}
void rezolva() {int i,j; for(i=3;i<=n;i+=2) if(( Prime[i/16] & (1<<(i/2%8)))==0) { cnt++; for(j=i*i;j<=n;j+=i*2) Prime[j/16]=Prime[j/16]|(1<<(j/2%8)); } }
void incheie() {delete []Prime; FILE *pout=fopen("ciur.out","w"); fprintf(pout,"%d",cnt+1); fclose(pout);}
int main() { pregateste(); rezolva(); incheie(); return 0; }
Dak ati putea sa imi spuneti unde gresesc...  Tx in advance  ) [EDIT]:Problema era din cauza functiei memset,cred ca nu accepta valori prea mari...de asta luam sigsegv.Oricum nu m-am lamurit.Cert e ca dupa ce am scos functia memset() iau 100 p.
|
|
« Ultima modificare: Decembrie 15, 2008, 20:19:06 de către Iacob Eduard »
|
Memorat
|
|
|
|
•vlad_D
Client obisnuit

Karma: 32
Deconectat
Mesaje: 67
|
 |
« Răspunde #28 : Decembrie 16, 2008, 20:14:48 » |
|
la memset trebuia sa pui memset(Prime, 0, sizeof(Prime)) fara sa imultesti cu alte minuni ca da pe dinafara 
|
|
|
Memorat
|
|
|
|
•k_ounu_eddy
|
 |
« Răspunde #29 : Decembrie 17, 2008, 15:26:19 » |
|
Ok,ai dreptate,am incercat si merge. Dar uite ce zice aici http://www.cplusplus.com/reference/clibrary/cstring/memset.html . void * memset ( void * ptr, int value, size_t num );
Fill block of memory
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).
Prin traducere ar veni asa:seteaza primii num bytes ai blocului de memorie...Dak pun acolo ultimul parametru sizeof(Prime),ar rezulta ca seteaza doar primii 4 bytes(aka Prime[0], Prime[1],Prime[2],Prime[3]) [EDIT]:Am facut niste teste in DJGPP ,si acuma imi da alte minuni.Si mai ziceti ca programarea nu are lucruri ciudate.Bine,pana la urma se datoreaza tot erorii umane,probabil ca are functia niste bug-uri ceva.Uitati un exemplu: #include<iostream> #include<string.h> #include<conio.h> using namespace std;
int main() { clrscr(); int *a; a=new int[1000]; memset(a,0,2); cout<<a[993];getch(); delete[]a; return 0; }
Puneti acolo la memset in loc de 2 orice vreti voi:1,2,3,4,100,1000 chiar si 0,si a[993] este egal to cu 0.
|
|
« Ultima modificare: Decembrie 17, 2008, 15:31:37 de către Iacob Eduard »
|
Memorat
|
|
|
|
•Florian
|
 |
« Răspunde #30 : Decembrie 17, 2008, 16:40:06 » |
|
Pai da. Pt ca in *a, ai NULL peste tot, indiferent daca faci memset sau nu. Incearca sa pui memset(a,13,2) si o sa vezi ca a[993] va fi 0. 
|
|
|
Memorat
|
|
|
|
•k_ounu_eddy
|
 |
« Răspunde #31 : Decembrie 17, 2008, 16:52:03 » |
|
Credeam ca doar variabilele globale sunt initializate cu 0,dar vad ca e si cazul alocarii dinamice. In concluzie sa inteleg ca de fiecare data cand aloc dinamic,vectorii alocati sunt initializati cu 0?
|
|
|
Memorat
|
|
|
|
•alexandru92
|
 |
« Răspunde #32 : Martie 06, 2009, 15:23:22 » |
|
daca puii ....... int main() { int *p; p=new int[1000]; cout<<p[993]<<endl; return 0;
Nu mai e 0.......plus am incercat codul tau nu-ti afiseaza 0 (compilat sub VC++). Cand pui new int.... ti se aloca o zona de memorie libera, care contine nume aleatoriu 
|
|
|
Memorat
|
|
|
|
•Prostu
|
 |
« Răspunde #33 : Martie 07, 2009, 12:24:34 » |
|
Am observat ca ultimele mesaje contin informatii gresite despre alocarea dinamica a memorie si modul in care se foloseste functia memset. Avand un pointer *p, pentru a aloca un vector de 1000 de elemente se procedeaza astfel: int *p; p = (int*) malloc( 1000 * sizeof(int) ); sau: int *p; p = new int[1000]; Acum p contine adresa unui bloc rezervat de 1000 de elemente. Toate elentele p[0], p[1] pana la p[999] contin valori reziduale. Ele nu sunt initializate in nici un fel in nici unul din apelurile de mai sus. Putem spune ca au valori aleatoare. Se poate intampla ca toate aceste valori sa fie 0, dar asta e din pura intamplare. Diferenta intre malloc si new este ca ultimul apeleaza constructorul clasei pentru care se face instantierea, dar nu cred ca se pot supraincarca constructorii tipurilor predefinite. Pentru a le initializa cu 0 folosind functia memset procedam in felul urmator: memset(p, 0, 1000 * sizeof(int)); Asta inseamna pentru compilatorul gcc de azi sa puna valoarea 0 pe 4000 de bytes pornind de la adresa pointata de p. sizeof( variabila ) returneaza dimensiunea in bytes a tipului variabila asadar sizeof( p ) va returna pe gcc fie valoarea 4, fie valoarea 8, depinde de configuratia fiecaruia (iar pe borland valoarea 2), si este dimensiunea implicita a oricarui pointer (nu depinde de tipul obiectului pointat ci doar de compilator). sizeof( int ) returneaza valoarea 4 in gcc si 2 in borland, sizeof( long ) returneaza valoarea 4 in gcc si 4 in borland. Daca p ar fi declarat astfel: atunci sizeof(p) ar returna valoarea 4000 pe gcc si 2000 pe borland (face diferenta). Dar aveti grija la urmatorul caz: void f(p[]) { // sizeof( p ) aici este valoarea unui pointer adica 2/4/8 }
int main() { int p[1000]; f(p); } memset( pointer, val_byte, dimensiune ) seteaza valoarea a dimensiune bytes pornind de la pointer cu valoarea val_byte. De exemplu: memset( p, 0, sizeof(p) ) ar seta pe 0 numai pe p[0] (in conditiile in care dimensiunea pointerului e 4, daca e 8 atunci ar seta si p[1]) memset(p, 0x3f, sizeof(int)) sau memset( p, 63, sizeof(int) ) ar seta p[0] cu valoarea cu 1061109567 sau 0x3f3f3f3f pentru ca sunt initializati 4 bytes cu valoarea 0x3f.
|
|
|
Memorat
|
|
|
|
•alexandru92
|
 |
« Răspunde #34 : Martie 09, 2009, 20:41:43 » |
|
Imi zice si mie cineva unde gresesc, adica imi apare KIll By Signel 11 chiar daca phi ii 3 000 001. Sursa e aici
|
|
|
Memorat
|
|
|
|
•c_e_manu
|
 |
« Răspunde #35 : Martie 09, 2009, 20:49:34 » |
|
nu iti intra in memorie 3 000 000 de long-uri... si eu zic ca te complici la implementarea aia... nu am studiat-o prea atent dar 100% nu mergi pe marcarea numarului ca prim sau neprim ca in sursa oficiala, fiindca afisezi phi [ n ]... uite o implementare mai simpla, ca si cea oficiala http://infoarena.ro/job_detail/161860?action=view-sourcein ok[] retin daca numarul este prim cu semnificatia: ok[ i ]=0 ->numarul e prim ok[ i ]=1 ->numarul nu e prim
|
|
|
Memorat
|
|
|
|
•alexandru92
|
 |
« Răspunde #36 : Martie 10, 2009, 06:34:07 » |
|
Pai daca ni se cere numarul de numere prime pana la n, nu calculam functia phi ??..... 3 000 000 am pus ca ma inerva ca tot apare Kiiled by signel 11 .......  ma scoate din sarite
|
|
|
Memorat
|
|
|
|
•gabitzish1
|
 |
« Răspunde #37 : Martie 10, 2009, 11:28:24 » |
|
Pai daca ni se cere numarul de numere prime pana la n, ne folosim de indiciul evident din titlul problemei : Ciurul lui Eratosthenes.
|
|
|
Memorat
|
|
|
|
•toni2007
|
 |
« Răspunde #38 : Martie 10, 2009, 12:13:39 » |
|
Nu de la idee e problema, mie imi pare corecta, ci de la faptul ca aloci un vector de 3 milioane, de tip long, cand ai doar 3 mega memorie. Citeste cu atentie enuntul si restrictiile la probleme inainte de a implementa (uneori chiar inutil) ceva.
|
|
|
Memorat
|
|
|
|
•valentinrosca
Strain
Karma: -8
Deconectat
Mesaje: 29
|
 |
« Răspunde #39 : Aprilie 01, 2009, 17:28:15 » |
|
E simplu: folositi o subrutina prim.E cea mai rapida cale. 
|
|
|
Memorat
|
|
|
|
•wefgef
|
 |
« Răspunde #40 : Aprilie 01, 2009, 19:16:18 » |
|
Si atunci de ce iei TLE? 
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
•SpiderMan
|
 |
« Răspunde #41 : Iunie 16, 2010, 09:30:41 » |
|
Ce frumos ... am reusit sa scot in pascal memorie mai buna decat in c++  .
|
|
|
Memorat
|
|
|
|
•JulotM
Strain
Karma: 0
Deconectat
Mesaje: 1
|
 |
« Răspunde #42 : Octombrie 04, 2010, 00:47:07 » |
|
Fisier gresit!!!
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #43 : Octombrie 04, 2010, 07:44:50 » |
|
Ce inseamna asta ?
|
|
|
Memorat
|
|
|
|
•Sapientia
Strain
Karma: 0
Deconectat
Mesaje: 29
|
 |
« Răspunde #44 : Martie 21, 2013, 20:48:17 » |
|
Killed by signal 11(SIGSEGV).Ce vrea sa insemne? Am obtinut 40 de puncte numai...:
#include <iostream> #include <fstream> #include <cmath> using namespace std; bool a[1000001]; int i,j,n; int main() { ifstream f("ciur.in"); ofstream g("ciur.out"); f>>n; f.close(); for(i=2;i<=trunc(sqrt(n));i++) if (a==0) { j=2; do { a[i*j]=1; j++;} while (j*i<n); } i=0; for(j=2;j<=n;j++) if (a[j]==0) i++; i--; g<<i; g.close(); return 0; }
|
|
|
Memorat
|
|
|
|
•PetcuIoan
Strain
Karma: 72
Deconectat
Mesaje: 49
|
 |
« Răspunde #45 : Martie 21, 2013, 21:11:23 » |
|
Pardon, dupa cum ziceam primesti signal 11 cand vrei sa accesezi memorie nealocata, n-ul maxim in problema este 2000000, tu ai vectorul de 1000000
|
|
|
Memorat
|
|
|
|
•Sapientia
Strain
Karma: 0
Deconectat
Mesaje: 29
|
 |
« Răspunde #46 : Martie 21, 2013, 21:24:07 » |
|
Multumesc.
|
|
|
Memorat
|
|
|
|
•AeroH
Strain
Karma: 0
Deconectat
Mesaje: 1
|
 |
« Răspunde #47 : Martie 27, 2013, 00:42:19 » |
|
Pentru testul 6, avem numarul 1356897, care este prim, dar in .ok acesta nu este luat in considerare. Ar trebui modificat din "mai mici sau egale cu N." in "numerelor prime mai mici decat N."; Eu am luat 90 cu "<=" si 100 cu "<".(Sau e doar cazul meu:-??);
|
|
|
Memorat
|
|
|
|
•PlayLikeNeverB4
|
 |
« Răspunde #48 : Martie 27, 2013, 10:17:05 » |
|
De ce esti atat de sigur ca e prim? Ti-l ia ca si prim fiindca ai "<" la for-ul cu care parcurgi multiplii.
|
|
|
Memorat
|
|
|
|
|
|