int number_of_primes = 1; //we know the first prime -- 2
long long *primes = new long long [number_of_primes];
Это создаст одноэлементный массив. Я почти уверен, что вам понадобится нечто большее, чем это, для хранения простых чисел.
В частности, как только вы начинаете устанавливать значения, например primes[11]
(например), вы попадаете в область неопределенного поведения.
Возможно, есть переменная , отличающаяся от , которую вы, возможно, захотите использовать для определения размера в выражении new
, подтолкнуть, подтолкнуть, подмигнуть, подмигнуть, как кивок для подмигивания слепой лошади: -)
В этом коде есть и другие проблемы. Главное, что ваше сито имеет длину всего 10 000 элементов. Идея сита заключается в том, что вы берете большое количество вещей и отфильтровываете те, которые не соответствуют. Что бы это ни стоило, 10,001 st - это прикосновение до 105 000, поэтому ваше сито должно быть как минимум настолько большим.
Во-вторых, я видел, как люди использовали квадрат числа для оптимизации поиска факторов, но не так:
for (long long j=current_sieve*current_sieve; j <= sieve_size; j++)
if (j%current_sieve == 0) sieve[j] = 1;
Вам нужно начать с двойного текущего сита и добавлять его каждый раз, например:
for (long long j = current_sieve * 2; j < sieve_size; j += current_sieve)
sieve[j] = 1;