Есть несколько примитивных способов, таких как этот, например, циклический просмотр нечетных чисел и еще несколько оптимизаций
int isPrime ( int n )
{
if (n <= 1) return 0; // zero and one are not prime
unsigned int i;
for (i=2; i*i<=n; i++) {
if (n % i == 0) return 0;
}
return 1;
}
Seive
является своего рода over-kill , в вашем случае (если вы не принимаете во внимание ваши требования к памяти), потому что диапазон может быть очень очень большим 1000000
, вы можете захотеть использовать какое-то растровое изображение для генерации Seive.
Вот очень слабо написанная идея о том, как создавать и использовать Seive.
char *seive;
void generate_seive( int n )
{
seive = calloc( 1, n );
if( !seive )
{
printf("E...");
exit(0);
}
// Generate Seive
for( int i = 2; i < n ; i ++)
{
if( seive[i] == 1 )
continue;
// Essentially mark all primes as 0 and
// non-primes as 1's
seive[i] = 0;
for( int j = i + i ; j < n ; j += i )
seive[j] = 1;
}
}
int main()
{
generate_seive(100);
// Iterating through the generated Seive
// should do
for( int i = 2; i < 100 ; i ++ )
if( seive[i] == 0 )
printf("%d\n", i);
return 0;
}