Skip to content

Instantly share code, notes, and snippets.

@SuryaPratapK
Created February 25, 2020 16:42
Show Gist options
  • Save SuryaPratapK/909585384607cb0502901e9e51f6e30e to your computer and use it in GitHub Desktop.
Save SuryaPratapK/909585384607cb0502901e9e51f6e30e to your computer and use it in GitHub Desktop.
// C++ program to print all primes smaller than or equal to
// n using Sieve of Eratosthenes
#include <bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes(int n)
{
// Create a boolean array "prime[0..n]" and initialize
// all entries it as true. A value in prime[i] will
// finally be false if i is Not a prime, else true.
bool prime[n+1];
memset(prime, true, sizeof(prime));
for (int p=2; p*p<=n; p++)
{
// If prime[p] is not changed, then it is a prime
if (prime[p] == true)
{
// Update all multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked.
for (int i=p*p; i<=n; i += p)
prime[i] = false;
}
}
// Print all prime numbers
for (int p=2; p<=n; p++)
if (prime[p])
cout << p << " ";
}
// Driver Program to test above function
int main()
{
int n = 30;
cout << "Following are the prime numbers smaller "
<< " than or equal to " << n << endl;
SieveOfEratosthenes(n);
return 0;
}
@sidhant-khamankar
Copy link

This line should be change to - from

for (int i=p*p; i<=n; i += p)

to

for (int i=p*2; i<=n; i += p)

Nope it's the Efficient solution

@laxmanp090404
Copy link

@anilbhatt The condition
for(int i=pp ; i<=n ; i+=p) is efficient as
any number less than p
p like ((p-1)*p) will be handled in previous values of p itself.
Hence it is redundant for making the same number false again and again.

for example
consider p = 3 then 2*3 or 6 will be handled when p=2 itself hence it is not required to check in p = 3.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment