Eratosthenes елегі

Project Euler сұрағын шешу кезінде Eratosthenes елегіне оқып беремін. Мен сіздермен қандай сұрақ туралы сөйлесетінін білесіздер. Міне, осылай. Менің кодексім 1 миллион көлеміндегі барлық праймдарды дұрыс көрсете алады. Дегенмен, 2 млн. Долларға бірдей қолданысқа енгізген кезде, ол маған сегменттеу кінәсін береді ... Менде қатенің пайда болуының неліктен екенін білуім керек, бірақ оны түзету әдісін білмеймін ... Міне, 1 миллион көлеміндегі кодтар.

#include
int main(void)
{
   int i,k=2;
   int j;
   int n=1000000;
   int prime[2000000]={};
   for(i=0;in)
                  break;    
            }
         }
      }
   }
   for(i=0;i
3
Бұл, мүмкін, шекаралық жиіліктер қатынасына ұқсас: prime [j * prime [i]] = 0 .
қосылды автор Jon, көзі
int n = 1000000; дегенді int n = 2000000;
қосылды автор Dave, көзі
Егер ол үлкен массив индекстеп алса, ол size_t сөзін де пайдалана алады
қосылды автор Dave, көзі
Бүйірлік жазбада, сіз int -дан басқа кейбір деректер түрлерін қолданғаныңыз жөн. Int 16 биттен басқа қандай да бір нақты өлшемге кепілдік бермейді. Стильдік мәселе ретінде long ұсынамын 32к жоғары сандар үшін.
қосылды автор logancautrell, көзі

1 жауаптар

Сіз стакадағы үлкен жиынды бөліп отырсыз:

int prime[2000000]={};

Төрт байт реті екі миллион сегіз мегабайтты құрайды, бұл жиі ең көп жинақ өлшемі болып табылады. Бөліну ақауларының нәтижелерінен көбірек бөлу.

Жиынды массивке орнына орналастыру керек:

int *prime;
prime = malloc(2000000 * sizeof(int));
if(!prime) {
    /* not enough memory */
}
/* ... use prime ... */
free(prime);
9
қосылды
4 * 2 * 10 ^ 6 = 7,6 * 2 ^ 20 = 7,6Мб
қосылды автор Dave, көзі
Рахмет! ... Қазір ол жұмыс істейді
қосылды автор Ole Gooner, көзі