C++ Program To Print Prime Numbers From 1 To N
Last Updated :
23 Apr, 2023
Given a number N, the task is to print the prime numbers from 1 to N. Examples:
Input: N = 10
Output: 2, 3, 5, 7
Input: N = 5
Output: 2, 3, 5
Algorithm:
- First, take the number N as input.
- Then use a for loop to iterate the numbers from 1 to N
- Then check for each number to be a prime number. If it is a prime number, print it.
Approach 1: Now, according to the formal definition, a number ‘n’ is prime if it is not divisible by any number other than 1 and n. In other words, a number is prime if it is not divisible by any number from 2 to n-1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int n)
{
if (n == 1 || n == 0) return false ;
for ( int i = 2; i < n; i++)
{
if (n % i == 0) return false ;
}
return true ;
}
int main()
{
int N = 100;
for ( int i = 1; i <= N; i++)
{
if (isPrime(i))
{
cout << i << " " ;
}
}
return 0;
}
|
Output:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Time Complexity: O(N^2), Space Complexity: O(1)
Approach 2: For checking if a number is prime or not do we really need to iterate through all the number from 2 to n-1? We already know that a number ‘n’ cannot be divided by any number greater than ‘n/2’. So, according to this logic we only need to iterate through 2 to n/2 since number greater than n/2 cannot divide n.
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int n)
{
if (n == 1 || n == 0) return false ;
for ( int i = 2; i <= n / 2; i++)
{
if (n % i == 0) return false ;
}
return true ;
}
int main()
{
int N = 100;
for ( int i = 1; i <= N; i++)
{
if (isPrime(i))
{
cout << i << " " ;
}
}
return 0;
}
|
Output:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Time Complexity: O(N^2), Space Complexity: O(1)
Approach 3: If a number ‘n’ is not divided by any number less than or equals to the square root of n then, it will not be divided by any other number greater than the square root of n. So, we only need to check up to the square root of n.
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int n)
{
if (n == 1 || n == 0) return false ;
for ( int i = 2; i * i <= n; i++)
{
if (n % i == 0) return false ;
}
return true ;
}
int main()
{
int N = 100;
for ( int i = 1; i <= N; i++)
{
if (isPrime(i))
{
cout << i << " " ;
}
}
return 0;
}
|
Output:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Time Complexity: O(N^(3/2)), Space Complexity: O(1)
You can further optimize the time complexity to O(n*log(log(n))).
Approach 4: Sieve of Eratosthenes Algorithm
Create a boolean array is_prime of size (N+1), initialized with true values for all elements.
Loop through the array is_prime from 2 to the square root of N (inclusive), and for each prime number p found in the loop:
If is_prime[p] is true, loop through the multiples of p from p*p up to N, and mark them as false in the is_prime array.
Loop through the array is_prime from 2 to N (inclusive), and for each index i where is_prime[i] is true, print i as a prime number.
C++
#include <bits/stdc++.h>
using namespace std;
void sieve_of_eratosthenes( int n)
{
bool is_prime[n + 1];
memset (is_prime, true , sizeof (is_prime));
is_prime[0] = is_prime[1] = false ;
for ( int p = 2; p * p <= n; p++) {
if (is_prime[p]) {
for ( int i = p * p; i <= n; i += p) {
is_prime[i] = false ;
}
}
}
for ( int i = 2; i <= n; i++) {
if (is_prime[i]) {
cout << i << " " ;
}
}
}
int main()
{
sieve_of_eratosthenes(100);
return 0;
}
|
Output
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Complexity Analysis:
Time complexity:
The outer loop runs from 2 to the square root of N, so it runs in O(sqrt(N)) time.
The inner loop runs from p*p to N, and for each prime number p, it eliminates the multiples of p up to N. Therefore, the inner loop runs at most N/p times for each prime number p, so it has a time complexity of O(N/2 + N/3 + N/5 + …), which is approximately O(N log(log(N))). This is because the sum of the reciprocals of the prime numbers up to N is asymptotically bounded by log(log(N)).
The final loop runs from 2 to N, so it has a time complexity of O(N).
Therefore, the overall time complexity of the algorithm is O(N log(log(N))).
Space complexity:
The algorithm uses an array of size N+1 to store the boolean values of whether each number is prime or not. Therefore, the space complexity is O(N).
In summary, the Sieve of Eratosthenes algorithm has a time complexity of O(N log(log(N))) and a space complexity of O(N) to print all the prime numbers from 1 to N.
To know more check Sieve of Eratosthenes.
Please refer complete article on Program to print prime numbers from 1 to N. for more details!
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...