Сито Ератосфена

Я читаю на ситі Ератосфена при вирішенні питання про проекту Euler . Я впевнений, ви, хлопці, знаєте яке питання, про яке я говорю. Ось речі. Моєму коду вдається правильно показати всі штрихові значення менше 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 . Інт не гарантує будь-якого конкретного розміру, крім 16 біт. Що стосується стилю, я рекомендую long для номерів вище 32k.
додано Автор 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, джерело