Pagini: 1 [2] 3   În jos
  Imprimă  
Ajutor Subiect: 010 Ciurul lui Eratosthenes  (Citit de 48090 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
k_ounu_eddy
Vorbaret
****

Karma: -104
Deconectat Deconectat

Mesaje: 161



Vezi Profilul
« Răspunde #25 : Decembrie 14, 2008, 14:56:49 »

Bool in gcc nu ocupa doar 1 bit?
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« 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
Vorbaret
****

Karma: -104
Deconectat Deconectat

Mesaje: 161



Vezi Profilul
« 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):

Cod:
#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...  Whistle
Tx in advance Wink)
[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 Deconectat

Mesaje: 67



Vezi Profilul
« 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 Smile
Memorat
k_ounu_eddy
Vorbaret
****

Karma: -104
Deconectat Deconectat

Mesaje: 161



Vezi Profilul
« 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 .
Citat
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:
Cod:
#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
Nu mai tace
*****

Karma: 125
Deconectat Deconectat

Mesaje: 832



Vezi Profilul
« 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.  Smile
Memorat
k_ounu_eddy
Vorbaret
****

Karma: -104
Deconectat Deconectat

Mesaje: 161



Vezi Profilul
« 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
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #32 : Martie 06, 2009, 15:23:22 »

daca puii .......
Cod:
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 Wink
Memorat
Prostu
Nu mai tace
*****

Karma: 134
Deconectat Deconectat

Mesaje: 323



Vezi Profilul
« 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:
Cod:
int *p;
p = (int*) malloc( 1000 * sizeof(int) );
sau:
Cod:
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:
Cod:
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:
Cod:
int p[1000];
atunci sizeof(p) ar returna valoarea 4000 pe gcc si 2000 pe borland (face diferenta).
Dar aveti grija la urmatorul caz:
Cod:
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
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« 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
Nu mai tace
*****

Karma: 56
Deconectat Deconectat

Mesaje: 243



Vezi Profilul
« 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-source

in ok[] retin daca numarul este prim cu semnificatia:
ok[ i ]=0 ->numarul e prim
ok[ i ]=1 ->numarul nu e prim
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« 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 ....... Brick wall ma scoate din sarite 
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« 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
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« 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 Deconectat

Mesaje: 29



Vezi Profilul
« Răspunde #39 : Aprilie 01, 2009, 17:28:15 »

E simplu:
folositi o subrutina prim.E cea mai rapida cale.  Very Happy
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #40 : Aprilie 01, 2009, 19:16:18 »

Si atunci de ce iei TLE? Tongue
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #41 : Iunie 16, 2010, 09:30:41 »

Ce frumos ... am reusit sa scot in pascal memorie mai buna decat in c++  Thumb up .
Memorat
JulotM
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« Răspunde #42 : Octombrie 04, 2010, 00:47:07 »

Fisier gresit!!!
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #43 : Octombrie 04, 2010, 07:44:50 »

Ce inseamna asta ?
Memorat
Sapientia
Strain
*

Karma: 0
Deconectat Deconectat

Mesaje: 29



Vezi Profilul
« 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 Deconectat

Mesaje: 49



Vezi Profilul
« 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 Deconectat

Mesaje: 29



Vezi Profilul
« Răspunde #46 : Martie 21, 2013, 21:24:07 »

Multumesc.
Memorat
AeroH
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« 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
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« 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
andrei8055
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #49 : Octombrie 25, 2013, 18:45:57 »

Salut,
Poate sa imi spuna si mie cineva de ce primesc 0 puncte la urmatoarea sursa ? http://www.infoarena.ro/job_detail/1014982?action=view-source
Am testat si cu N = 15,485,863 (care e al 1.000.000 numar prim) si imi returneaza corect.  Think
Memorat
Pagini: 1 [2] 3   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines