Pagini recente » Cod sursa (job #2088031) | Cod sursa (job #493281) | Cod sursa (job #3284502) | Cod sursa (job #1508848) | Cod sursa (job #2228877)
#include <stdio.h>
unsigned p[(2000000U >> 6U) + 1U]{};
unsigned sieve(unsigned n)
{
register unsigned i, j, nr = 1U + (n > 2U);
for(i = 2U; ((i * i) << 1U) + (i << 1U) < n - 3U; i += 2U)
{
if((p[i >> 5U] & (1U << (i & 31U))) == 0U)
{
for(j = ((i * i) << 1U) + (i << 1U); (j << 1U) < n; j += (i << 1U) + 1U)
{
p[j >> 5U] |= (1U << (j & 31U));
}
}
++i;
if((p[i >> 5U] & (1U << (i & 31U))) == 0U)
{
for(j = ((i * i) << 1U) + (i << 1U); (j << 1U) < n; j += (i << 1U) + 1U)
{
p[j >> 5U] |= (1U << (j & 31U));
}
}
}
for(i = 2U; (i << 1U) < n - 2U; i += 3U)
{
nr += ((p[ i >> 5U] & (1U << ( i & 31U))) == 0U) +
((p[(i + 1U) >> 5U] & (1U << ((i + 1U) & 31U))) == 0U);
}
return nr;
}
int main()
{
freopen("ciur.in", "r", stdin);
freopen("ciur.out", "w", stdout);
unsigned N; scanf("%d", &N);
printf("%u ", sieve(N));
return 0;
}