Я написал код для сита, но программа работает только для размера массива, меньшего или равного 1000000. Для остальных случаев, которые больше, происходит простое SIGSEGV. Может ли это быть сделано для запуска случаев> 1000000. Или где я ошибаюсь?Сито эратосфена: SIGSEGV?
#include <stdio.h>
int main()
{
unsigned long long int arr[10000001] = {[0 ... 10000000] = 0};
unsigned long long int c=0,i,j,a,b;
scanf("%llu%llu",&a,&b);
for(i=2;i<=b;i++)
if(arr[i] == 0)
for(j=2*i;j<=b;j+=i)
arr[j] = 1;
for(i=(a>2)?a:2;i<=b;i++)
if(arr[i] == 0)``
c++;
printf("%llu",c);
return 0;
}
Связанный: Вы понимаете (или взглядов его не), что данные * в * решето Эратосфена может быть в буквальном смысле * бит *, (используйте 'unsigned char', если вы не хотите делать математику с битовым смещением)? Думаю об этом. его массив * flags *, вот и все. Его * указывает * на тот массив, который вам действительно нужен. Существует * нет * причины хранения 64-битных значений, когда все, о чем вы заботитесь, это то, являются ли они нулевыми или ненулевыми. – WhozCraig
Relax: SIGSEGV является последним премьер. –
@WhozCraig Да, сэр, я это понял. Обычная глупость для хранения 0/1 в unsigned long long. – pukingminion